在级别上查找已连接的组

时间:2016-06-05 10:27:37

标签: neo4j cypher

节点A具有3个连接的节点B1,B2,B3。那些Bx节点再次连接节点C1,C2,C3和C4。节点A还有2个连接的节点C5和C6。

从节点A开始,我想收集所有C节点。我对A节点进行了查询,收集了两个C节点,然后查询了B节点,再次收集所有C节点并合并两个阵列。工作但不是很聪明。

我试过(Pseudocode)

MATCH (g)<-[:IS_SUBGROUP_OF*1]-(i)-[:HAS_C_NODES]->(c) WHERE g = A.uuid  RETURN C_NODES

但我得到A或B节点的所有c节点

如何进行收集从节点A开始的所有C-Node的查询?

*已编辑* 以下是一些示例数据:

CREATE (a:A), (b1:B1), (b2:B2), (b3:B3), (c1:C1), (c2:C2), (c3:C3), (c4:C4), (a)-[r:HAS]->(c4), (a)-[r1:HAS]->(b1), (a)-[r2:HAS]->(b2), (a)-[r3:HAS]->(b3), (b1)-[r4:HAS]->(c1), (b1)-[r5:HAS]->(c2), (b2)-[r6:HAS]->(c3)

查询应返回以C开头的所有节点,无论它们连接到哪个节点(A或B)。

1 个答案:

答案 0 :(得分:1)

您可以为每个节点添加多个标签。你应该利用这个优势,并将所有B和C节点分成第二个标签。

例如:

CREATE (a:A), (b1:B1:BType), (b2:B2:BType), (b3:B3:BType), (c1:C1:CType), (c2:C2:CType), (c3:C3:CType), (c4:C4:CType), (a)-[r:HAS]->(c4), (a)-[r1:HAS]->(b1), (a)-[r2:HAS]->(b2), (a)-[r3:HAS]->(b3), (b1)-[r4:HAS]->(c1), (b1)-[r5:HAS]->(c2), (b2)-[r6:HAS]->(c3)

我修改了你的create语句,将所有B节点分组为:BType标签和所有C节点:CType标签。

您可以简单地使用可选的匹配关键字来选择性地遍历关系(如果存在)并获得所需的结果。

match (a:A)-[:HAS]->(b:BType)-[:HAS]->(c:CType) optional match (a:A)-[:HAS]->(xc:CType) return c,xc

如果您希望将两组节点组合在一起,则可以使用collect()来尝试此语句。

match (a:A)-[:HAS]->(b:BType)-[:HAS]->(c:CType) with a,collect (distinct c) as set1 optional match (a:A)-[:HAS]->(xc:CType) return set1 + collect (distinct xc) as output