我有一个包含两种节点的图:一种表示客户,另一种表示商家和商店。该图跟踪顾客在商店的位置和花费,用边表示这种交互。下面是我创建它们的方法:
-- Customers
CREATE (Bobby :Person {id:'1', name:'Bobby', gender:'man', age: 72})
-- Merchants
CREATE (Amazon :Merchant {id:'2', name:'Amazon', street:'2626 Wilkinson Court', address:'San Bernardino, CA 92410'})
-- Transaction
CREATE (Bobby)-[:HAS_BOUGHT_AT {amount:'986', time:'4/17/2014', status:'Undisputed'}]->(Amazon)
当我想只检索按降序排列的购买日期时,它成功返回它们:
SELECT * FROM cypher('MyGraph', $$
MATCH (v)-[r :HAS_BOUGHT_AT]->(m)
WITH toInteger(split(r.time, '/')[0]) as month,
toInteger(split(r.time, '/')[1]) as day,
toInteger(split(r.time, '/')[2]) as year
RETURN month, day, year
ORDER BY year DESC, month DESC, day DESC
$$) AS (month agtype, day agtype, year agtype);
month | day | year
-------+-----+------
12 | 28 | 2014
12 | 26 | 2014
12 | 24 | 2014
12 | 23 | 2014
12 | 20 | 2014
12 | 20 | 2014
12 | 20 | 2014
12 | 20 | 2014
12 | 16 | 2014
12 | 15 | 2014
11 | 28 | 2014
11 | 27 | 2014
11 | 14 | 2014
10 | 25 | 2014
10 | 15 | 2014
但是如果我想显示正在匹配的顶点的名称,它会抛出一个错误。
SELECT * FROM cypher('MyGraph', $$
MATCH (v)-[r :HAS_BOUGHT_AT]->(m)
WITH toInteger(split(r.time, '/')[0]) as month,
toInteger(split(r.time, '/')[1]) as day,
toInteger(split(r.time, '/')[2]) as year
RETURN month, day, year, v.name, m.name
ORDER BY year DESC, month DESC, day DESC
$$) AS (month agtype, day agtype, year agtype, v_name agtype, m_name agtype);
ERROR: no relation entry for relid 3
你得到这个错误的原因是你没有传递v和。所以不能在WITH之后访问它们。
下面的查询可以解决您的错误。
SELECT * FROM cypher('graph', $$
MATCH (v)-[r :HAS_BOUGHT_AT]->(m)
WITH v,m,toInteger(split(r.time, '/')[0]) as month,
toInteger(split(r.time, '/')[1]) as day,
toInteger(split(r.time, '/')[2]) as year
RETURN month, day, year, v.name, m.name
ORDER BY year DESC, month DESC, day DESC
$$) AS (month agtype, day agtype, year agtype, v_name agtype, m_name agtype);
结果:
month | day | year | v_name | m_name
-------+-----+------+---------+----------
4 | 17 | 2014 | "Bobby" | "Amazon"
(1 row)