Neo4j Cypher:根据 EXTRACT 和 WHEN CASE 中的关系选择节点

Neo4j Cypher: Selecting a node as per relationship in EXTRACT with WHEN CASE

我对 Cypher 和 neo4j 比较陌生,正在玩一个有 2 个公交车站的简单场景 1) BusStop1 1- [:Next]- BusStop 2(即 2 个 Bus Stop 节点,它们之间有 Next 关系。

2) 编号 35 节点与 BusStop1 和 BusStop2 相关,关系为 (STOPS_AT) 。因此,如果我查询 BusStop1 和 BusStop2 之间的最小路径,我会得到可用于旅行的公交车站和 35 路公交车。

3) Number35 节点也与 XYz 公司有关系 OPERATED_BY,所以我知道 XYZ 公司是 运行 35 路公交车。

我的问题开始于我在 EXTRACT 中获得节点列表后,我有一个 WHEN 案例用于公交车站和 35 号,但是我如何前往 WHEN 案例中的 XYZ 公司

MATCH p = allShortestPaths((a)-[:STOPS_AT*]-(d)) (---工作正常---)

RETURN EXTRACT(x IN NODES(p) | CASE WHEN x:Bus THEN 'Bus ' + x.id

(((----此时节点是公交车号我还需要遍历与其Operator的关系??????如何))) ,

当 x:Bus然后停止 'BusStop ' + x.name

此查询将 return 运营公司获取在公交车站停靠的公交车的不同列表。

您将希望以某种方式(可能通过停靠站或停靠站集合)包含此内容,否则它将完全匹配每次出现的公共汽车停靠站。在你的小数据集中不是问题,但在更大的数据集中,它可能 return 大量数据,只会导致收集所有公交车和所有公司,它们的价格要便宜得多备用查询。

// simplified version of your first line with some labels
match p=(a:Bus)-[r:STOPS_AT]->(d:Stop)
// filter the bus nodes and extract them fro the result
with [b IN nodes(p) WHERE labels(b)[0] = 'Bus'] as buses
// remove the duplicate buses from the result set
unwind buses as b 
with collect(distinct b) as buses
// iterate over the distinct buses and find the operating company
unwind buses as b
match b-[:OPERATED_BY]->(c:Company)
return b.name as Bus, c.name as Company

你是不是在找车站、公交车和运营商?如果是这样,另一种方法可能就是这样要求...

match (c:Company)<-[:OPERATED_BY]-(a:Bus)-[r:STOPS_AT]->(d:Stop)
return c.name, a.name, d.name