如何合并两条Neo4j Cypher查询的返回结果?
合并Cypher查询结果的几种方法
针对你的需求,有三种实用的方法可以把两个查询的结果合并,同时在Neo4j的图视图里展示完整的关联关系:
方法1:多模式MATCH(取交集)
如果只需要同时存在两种关联的Flower节点(既连到Human-Animal-Fruit路径,又连到Threat),可以直接把两个MATCH模式用逗号合并:
MATCH (f:Fruit)-[r0]-(a:Animal)-[r1]-(h:Human)-[r2]-(p:Plant), (p)-[r3]-(t:Threat) WHERE p.type = 'Flower' RETURN *;
方法2:OPTIONAL MATCH(全量合并,推荐)
如果想要所有type='Flower'的Plant节点,不管它们有没有其中一种关联,用OPTIONAL MATCH来匹配两种路径,这样会返回所有符合条件的节点和关系,缺失的部分会显示为NULL,但图视图里只会展示实际存在的关联:
MATCH (p:Plant) WHERE p.type = 'Flower' OPTIONAL MATCH (f:Fruit)-[r0]-(a:Animal)-[r1]-(h:Human)-[r2]-(p) OPTIONAL MATCH (p)-[r3]-(t:Threat) RETURN *;
这种方法最贴合你的需求,能把两个查询的所有图元素合并到一个视图里,同一个Plant节点只会显示一次。
方法3:UNION ALL(合并结果集)
如果需要严格合并两个查询的结果行,即使有些节点只在其中一个查询里出现,可以用UNION ALL,但要保证两个查询返回的列结构一致,用NULL填充缺失的字段:
MATCH (f:Fruit)-[r0]-(a:Animal)-[r1]-(h:Human)-[r2]-(p:Plant) WHERE p.type = 'Flower' RETURN f, r0, a, r1, h, r2, p, NULL AS r3, NULL AS t UNION ALL MATCH (p:Plant)-[r3]-(t:Threat) WHERE p.type = 'Flower' RETURN NULL AS f, NULL AS r0, NULL AS a, NULL AS r1, NULL AS h, NULL AS r2, p, r3, t;
这种方式在表格视图里会保留两个查询的所有结果行,图视图里同样会合并展示所有节点和关系。
内容的提问来源于stack exchange,提问作者NoviceY
相关产品推荐
相关产品推荐

