搜索多种关系类型时返回Neo4J组合关系

时间:2016-08-05 15:01:26

标签: neo4j cypher graph-databases

我想查询各种事情并返回一组合并关系。在下面的示例中,我想返回所有名为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中重新编写查询以获得所需的结果?

1 个答案:

答案 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