我想查询各种事情并返回一组合并关系。在下面的示例中,我想返回所有名为Joe的人居住在Main St.我想要返回has_address和has_state关系。
MATCH (p:Person),
(p)-[r:has_address]-(a:Address),
(a)-[r1:has_state]-(s:State)
WHERE p.name =~ ".*Joe.*" AND a.street = ".*Main St.*"
RETURN r, r1;
但是当我在Neo4J浏览器中运行此查询并查看" Text"看来,似乎把r和r1作为列放在一个表中(类似这样):
│r │r1 │
╞═══╪═══|
│{} │{} │
而不是在不同行上的每个关系,如:
Joe Smith | has_address | 1 Main Street
1 Main Street | has_state | NY
Joe Richards | has_address | 22 Main Street
我想将其下载为CSV文件,以便在其他位置进行过滤。如何在Neo4J中重新编写查询以获得所需的结果?
答案 0 :(得分:0)
您可能需要查看Cypher cheat sheet,特别是关系函数。
也就是说,您需要的所有节点上都有变量。您可以输出每行所需的所有数据。
MATCH (p:Person),
(p)-[r:has_address]-(a:Address),
(a)-[r1:has_state]-(s:State)
WHERE p.name =~ ".*Joe.*" AND a.street = ".*Main St.*"
RETURN p.name AS name, a.street AS address, s.name AS state
这应该足够了。
上面你要求的是一种结合r和r1的方法,但是这样它们按顺序交替,一行是r而另一行是它对应的r1。这是一种非常典型的查询,因此没有很多支持来轻松制作这种输出。
如果你不介意行乱序,那很容易,但每个关系的起点和终点不再是同一类型。
MATCH (p:Person),
(p)-[r:has_address]-(a:Address),
(a)-[r1:has_state]-(s:State)
WHERE p.name =~ ".*Joe.*" AND a.street = ".*Main St.*"
WITH COLLECT(r) + COLLECT(r1) as rels
UNWIND rels AS rel
RETURN startNode(rel) AS start, type(rel) AS type, endNode(rel) as end