如何从neo4j中的两个不同关系中获得输出

如何从neo4j中的两个不同关系中获得输出,neo4j,cypher,spring-data-neo4j,Neo4j,Cypher,Spring Data Neo4j,我的型号是transoport系统: 节点:公共汽车站、公共汽车、运输操作员 关系:总线停止-[:停止]->总线 关系:总线-[由]->TransportOperator操作 如果我使用以下查询,我会得到一个输出: 查询: MATCH (a:BusStop{name:'Bonhoefferstrasse'}),(d:BusStop {name:'HeidelBerg Hauptbanhof'}) MATCH p = allShortestPaths((a)-[:STOPS_AT*]-(d))

我的型号是transoport系统:

节点:公共汽车站、公共汽车、运输操作员

关系:总线停止-[:停止]->总线

关系:总线-[由]->TransportOperator操作

如果我使用以下查询,我会得到一个输出:

查询:

MATCH (a:BusStop{name:'Bonhoefferstrasse'}),(d:BusStop {name:'HeidelBerg Hauptbanhof'})
MATCH p = allShortestPaths((a)-[:STOPS_AT*]-(d))

RETURN EXTRACT(x IN NODES(p) | CASE WHEN x:Bus THEN 'Bus' + x.id   WHEN x:BusStop THEN 'BusStop'+ x.name
ELSE '' END) AS RouteDetails
输出:

BusStopBonhoefferstrasse, Bus34, BusStopHeidelBerg Hauptbanhof
但是从上面的关系来看,如果我想在输出中显示操作符,我该如何查询?neo4j是否提供了一个功能来实现这一点

例如:(这个查询是错误的,只是为了给出我想要得到的输出)

我可以建立俱乐部2关系(用于上述比赛查询)吗

预计产量:Busstopponhoeferstrasse,Bus34,RNV,Busstoppheidelberg Hauptbanhof

扩建:

示例数据:

CREATE (a:Stop {name:'A'}),
       (b:Stop {name:'B'}),
       (c:Stop {name:'C'}),
       (d:Stop {name:'D'}),

       (a)-[:NEXT {distance:1}]->(b),
       (b)-[:NEXT {distance:2}]->(c),
       (c)-[:NEXT {distance:3}]->(d),

       (b1:Bus {id:1}),
       (b2:Bus {id:2}),
       (b3:Bus {id:3}),

       (o1:Operator {id:1}),
       (o2:Operator {id:2}),

       (b1)-[:OPERATED_BY]->(o1),
       (b2)-[:OPERATED_BY]->(o1),
       (b3)-[:OPERATED_BY]->(o2),

       (b1)-[:STOPS_AT]->(a),
       (b1)-[:STOPS_AT]->(b),
       (b2)-[:STOPS_AT]->(a),
       (b2)-[:STOPS_AT]->(b),
       (b2)-[:STOPS_AT]->(c),
       (b3)-[:STOPS_AT]->(b),
       (b3)-[:STOPS_AT]->(c),
       (b3)-[:STOPS_AT]->(d);
解决方案:

MATCH (a:Stop {name:'A'}), (d:Stop {name:'D'})
MATCH p = allShortestPaths((a)-[:STOPS_AT*]-(d))
WITH p, FILTER(x IN NODES(p) WHERE x:Bus) AS buses
UNWIND buses AS bus
MATCH (bus)-[:OPERATED_BY]->(o:Operator)
RETURN EXTRACT(x IN NODES(p) | CASE WHEN x:Stop THEN 'Stop ' + x.name
                                    WHEN x:Bus THEN 'Bus ' + x.id
                               ELSE '' END) AS itinerary,
       COLLECT('Bus ' + bus.id + ':' + 'Operator ' + o.id) AS operators
结果:

itinerary                               operators
[Stop A, Bus 2, Stop B, Bus 3, Stop D]  [Bus 2:Operator 1, Bus 3:Operator 2]
[Stop A, Bus 1, Stop B, Bus 3, Stop D]  [Bus 1:Operator 1, Bus 3:Operator 2]
[Stop A, Bus 2, Stop C, Bus 3, Stop D]  [Bus 2:Operator 1, Bus 3:Operator 2]

控制台:

您还可以使用:
EXTRACT(节点中的x(p)|当x:Bus然后是'Bus'+x.id+'操作符时的情况:'head(EXTRACT(节点中的p)-[:Operated_By]->()(节点(p))。当x:bustop时命名,然后是'bustop'+x.name ELSE''END)作为路由详细信息
,但我喜欢Nicole的建议,感谢christophe的帮助。
itinerary                               operators
[Stop A, Bus 2, Stop B, Bus 3, Stop D]  [Bus 2:Operator 1, Bus 3:Operator 2]
[Stop A, Bus 1, Stop B, Bus 3, Stop D]  [Bus 1:Operator 1, Bus 3:Operator 2]
[Stop A, Bus 2, Stop C, Bus 3, Stop D]  [Bus 2:Operator 1, Bus 3:Operator 2]