在多个关系类型中搜索时返回Neo4J组合关系



我想查询各种东西,并返回一组组合关系。在下面的示例中,我想返回住在Main St.的所有名为Joe的人。我想返回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中重写查询以获得所需的结果?

您可能需要查看Cypher备忘单,特别是关系函数。

也就是说,在所有需要的节点上都有变量。您可以在每一行上输出所需的所有数据。

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

最新更新