对单个 Neo4j 节点使用多个变量

问题描述 投票:0回答:1

我有一个返回一些结果的密码查询

MATCH (nodeFrom0:Z{})-[r1:FLOWS_TO]->(nodeTo1:A{})
MATCH (nodeTo1:A{})-[r2:FLOWS_TO]->(nodeTo2:A{})
MATCH (nodeTo2:A{})-[r3:FLOWS_TO]->(nodeTo3:A{})
MATCH (nodeTo3:A{})-[r4:FLOWS_TO]->(nodeTo4:B{})
MATCH (nodeTo4:B{})-[r5:FLOWS_TO]->(nodeTo5:C{})
MATCH (nodeTo5:C{})-[r6:FLOWS_TO]->(nodeTo6:B{})
MATCH (nodeTo4:B{})-[r7:FLOWS_TO]->(nodeTo7:D{})
MATCH (nodeTo7:D{})-[r8:FLOWS_TO]->(nodeTo6:B{})
MATCH (nodeTo6:B{})-[r9:FLOWS_TO]->(nodeTo8:E{})

RETURN nodeFrom0, nodeTo1, nodeTo2, nodeTo3, nodeTo4, nodeTo5, nodeTo6, nodeTo7, nodeTo8

但是我不想重复使用变量名,并根据 Id 识别相同的节点并使用新变量,我该怎么做

尝试过

MATCH (nodeFrom0:Z{}) -[nodeRelation0:FLOWS_TO]-> (nodeTo0:A{})
MATCH (nodeFrom1:A{id: nodeTo0.id}) -[nodeRelation1:FLOWS_TO]-> (nodeTo1:A{})
MATCH (nodeFrom2:A{id: nodeTo1.id}) -[nodeRelation2:FLOWS_TO]-> (nodeTo2:A{})
MATCH (nodeFrom3:A{id: nodeTo2.id}) -[nodeRelation3:FLOWS_TO]-> (nodeTo3:B{})
MATCH (nodeFrom4:B{id: nodeTo3.id}) -[nodeRelation4:FLOWS_TO]-> (nodeTo4:C{})
MATCH (nodeFrom5:C{id: nodeTo4.id}) -[nodeRelation5:FLOWS_TO]-> (nodeTo5:B{})
MATCH (nodeFrom6:B{id: nodeTo5.id}) -[nodeRelation6:FLOWS_TO]-> (nodeTo6:D{})
MATCH (nodeFrom7:D{id: nodeTo6.id}) -[nodeRelation7:FLOWS_TO]-> (nodeTo7:B{})
MATCH (nodeFrom8:B{id: nodeTo7.id}) -[nodeRelation8:FLOWS_TO]-> (nodeTo8:E{})
return nodeFrom0,nodeRelation0,nodeTo0,nodeFrom1,nodeRelation1,nodeTo1,nodeFrom2,nodeRelation2,nodeTo2,nodeFrom3,nodeRelation3,nodeTo3,nodeFrom4,nodeRelation4,nodeTo4,nodeFrom5,nodeRelation5,nodeTo5,nodeFrom6,nodeRelation6,nodeTo6,nodeFrom7,nodeRelation7,nodeTo7,nodeFrom8,nodeRelation8,nodeTo8

这里基本上nodeTo1和nodeFrom2的id是相同的,最终节点是相同的。但我的第二个查询没有返回任何结果。

原因是,我正在生成此查询,读取关系的 json,[{node1:xxxx, relation:xxxx, node2:xxxx},{node1:xxxx, relation:xxxx, node2:xxxx}]

因此,如果一个json的node2的Id与node1的id匹配,我可以将其视为相同的节点,但具有不同的变量名称,因为它将生成代码

由此产生的 cypher 查询也应该返回类似的形式输出。

neo4j cypher graph-databases cypher-shell
1个回答
0
投票

生成独立的关系查询(如第二个查询)会导致 Cypher 效率低下,因为您必须多次扫描相同的开始/结束节点。这不是一种“图形”方法。相反,预处理原始数据会更快,以便生成重用已找到的节点的 Cypher,从而允许 Neo4j 快速利用关系来查找路径中的后续节点(无需任何扫描)。

您想要生成的内容与此类似:

MATCH
  (nodeFrom0:Z)
  -[:FLOWS_TO]->(nodeTo1:A{id: 1})
  -[:FLOWS_TO]->(nodeTo2:A{id: 2})
  -[:FLOWS_TO]->(nodeTo3:A{id: 3})
  -[:FLOWS_TO]->(nodeTo4:B{id: 4})
  -[:FLOWS_TO]->(nodeTo5:C{id: 5})
  -[:FLOWS_TO]->(nodeTo6:B{id: 6}),
  (nodeTo4)
  -[:FLOWS_TO]->(nodeTo7:D{id: 7})
  -[:FLOWS_TO]->(nodeTo6)
  -[:FLOWS_TO]->(nodeTo8:E{id: 8})
RETURN nodeFrom0, nodeTo1, nodeTo2, nodeTo3, nodeTo4, nodeTo5, nodeTo6, nodeTo7, nodeTo8

或者至少是这样:

MATCH
  (nodeFrom0:Z)-[:FLOWS_TO]->(nodeTo1:A{id: 1}),
  (nodeTo1)-[:FLOWS_TO]->(nodeTo2:A{id: 2}),
  (nodeTo2)-[:FLOWS_TO]->(nodeTo3:A{id: 3}),
  (nodeTo3)-[:FLOWS_TO]->(nodeTo4:B{id: 4}),
  (nodeTo4)-[:FLOWS_TO]->(nodeTo5:C{id: 5}),
  (nodeTo5)-[:FLOWS_TO]->(nodeTo6:B{id: 6}),
  (nodeTo4)-[:FLOWS_TO]->(nodeTo7:D{id: 7}),
  (nodeTo7)-[:FLOWS_TO]->(nodeTo6),
  (nodeTo6)-[:FLOWS_TO]->(nodeTo8:E{id: 8})
RETURN nodeFrom0, nodeTo1, nodeTo2, nodeTo3, nodeTo4, nodeTo5, nodeTo6, nodeTo7, nodeTo8
© www.soinside.com 2019 - 2024. All rights reserved.