我在 Neo4j 中创建了一个图表用于测试目的。图表如下图所示(简化):
我想要的是从伦敦到爱丁堡的路径。为此,我创建了以下 Cypher 查询:
MATCH (start:CITY {Name: "London"})
MATCH (end:CITY {Name: "Edinburgh"})
MATCH path = (start)-[:HAS_STATION]->(:STATION)-[:BOARDS]->(:SECTION)-[:NEXT_SECTION*]->(:SECTION)-[:UNBOARDS]->(:STATION)<-[:HAS_STATION]-(end)
此查询为我提供了通过第 1、2 和 3 部分的整个路径。我的结果所需的只是第一部分和最后一部分。如果中间有转运(即格拉斯哥),我还需要转运前的最后一部分和转运后的第一部分。
换句话说:我需要从路径直接连接到车站的每个部分。我尝试了以下扩展:
with nodes(path) as nodes
unwind nodes as node
with node
where ()-[:BOARDS]->(node) or (node)-[:UNBOARDS]->()
但是通过该查询扩展,我最终得到了所有部分,因为它们都可以在特定车站上车或下车(即使该车站不是路径的一部分)。
要获取路径中的第一个和最后一个 SECTION,请在 NEXT_SECTION 可变长度部分两侧的节点模式中声明一个变量:
MATCH (start:CITY {Name: "London"})
MATCH (end:CITY {Name: "Edinburgh"})
MATCH path = (start)-[:HAS_STATION]->(:STATION)-[:BOARDS]->
(first:SECTION)-[:NEXT_SECTION*]->(last:SECTION)-[:UNBOARDS]->
(:STATION)<-[:HAS_STATION]-(end)
RETURN first, last