首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从neo4j中的两种不同关系中提取出发时间和到达时间

如何从neo4j中的两种不同关系中提取出发时间和到达时间
EN

Stack Overflow用户
提问于 2015-01-29 22:24:32
回答 3查看 123关注 0票数 2

模式是运输系统:

节点: BusStop、Bus、TransportOperator

关系:总线操作->传输操作器

关系:汽车站-:车站->巴士

relationship STOPS_AT有两个属性到达时间(9:00)和起飞时间(9:01)连接到所有的公共汽车站。

例如: 34路总线连接到BusStop1(ArrTime-9:00,DeptTime-9:01),BusStop2(ArrTime-9:10,DeptTime-9:11),BusStop3(ArrTime-9:15,DeptTime-9:16)

如果使用下面的查询,就会得到一个输出,如下所示:

代码语言:javascript
复制
enter code here

MATCH (a:BusStop{name:'Bonhoefferstrasse'}),(d:BusStop {name:'HeidelBerg Hauptbanhof'})
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:TransportOperator)
RETURN EXTRACT(x IN NODES(p) | CASE WHEN x:BusStop THEN 'BusStop' + x.name
    WHEN x:Bus THEN 'Bus' + x.id
    ELSE '' END) AS itinerary,
COLLECT ('Bus' + Bus.id+ ':' + 'TransportOperator' + o.name) AS Operators

输出:

行程: BusStopBonhoefferstrasse,Bus34,BusStopHeidelBerg Hauptbanhof

运营商:Bus34:TransportOperatorRhein Neckar-Verkehr

预期产出:

行程:DeptTime:9:01,BusStopBonhoefferstrasse Bus34,RNV,BusStopHeidelBerg Hauptbanhof ArrTime:9:15

运营商: Bus34: TransportOperatorRhein Verkehr

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-29 23:34:16

再来一次:

代码语言:javascript
复制
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 {arrival:'9:00', departure:'9:01'}]->(a),
       (b1)-[:STOPS_AT {arrival:'9:10', departure:'9:11'}]->(b),
       (b2)-[:STOPS_AT {arrival:'9:05', departure:'9:06'}]->(a),
       (b2)-[:STOPS_AT {arrival:'9:20', departure:'9:21'}]->(b),
       (b2)-[:STOPS_AT {arrival:'9:29', departure:'9:30'}]->(c),
       (b3)-[:STOPS_AT {arrival:'9:45', departure:'9:46'}]->(b),
       (b3)-[:STOPS_AT {arrival:'9:50', departure:'9:51'}]->(c),
       (b3)-[:STOPS_AT {arrival:'9:57', departure:'9:58'}]->(d);

您应该将出发时间和到达时间作为自己的列返回:

代码语言:javascript
复制
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,
       HEAD(RELATIONSHIPS(p)).departure AS departure_time,
       LAST(RELATIONSHIPS(p)).arrival AS arrival_time,
       COLLECT('Bus ' + bus.id + ':' + 'Operator ' + o.id) AS operators

http://console.neo4j.org/r/x8fx3b

票数 4
EN

Stack Overflow用户

发布于 2015-01-29 23:35:55

不必迭代路径中的节点集合,您可以遍历关系集合。

我认为像这样的东西会返回你想要的结果。

代码语言:javascript
复制
...
EXTRACT(s IN relationships(p) | CASE 
WHEN 'BusStop' in labels(startNode(s)) THEN 'BusStop' + (startNode(s)).name + ' ' + s.DepTime
WHEN 'BusStop' in labels(endNode(s)) THEN 'BusStop' + (endNode(s)).name + ' ' + s.ArrTime
WHEN 'Bus' in labels(startNode(s)) THEN 'Bus' + (startNode(s)).name
ELSE '' END) AS itinerary
...
票数 2
EN

Stack Overflow用户

发布于 2015-01-29 23:10:10

编辑:我误解了数据模型,所以这个答案实际上行不通。

====================================================

看起来问题就在你的返回语句中。您的意思是只返回与总线停止名连接的字符串'BusStop‘。

您可以更改提取语句以返回到达和离开时间,但是只在第一个节点上获得到达时间和仅在最后一个节点上获得出发时间可能需要重新考虑您的查询。以下是您需要将到达时间添加到所有结果中的内容。根据预期的输出,这并不是您所需要的,但是应该给您一个很好的概念,为什么没有时间输出:

代码语言:javascript
复制
EXTRACT(x IN NODES(p) | CASE 
WHEN x:BusStop THEN 'BusStop' + x.name + ' ' + x.ArrTime
WHEN x:Bus THEN 'Bus' + x.id
ELSE '' END) AS itinerary
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28225817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档