首页 > 解决方案 > 如何根据关系类型将路径拆分为子路径?

问题描述

我有以下图表:

(:Stop)<-[:IS_LOCATED_AT]-(:Stoptime)-[:IS_PART_OF]->(:Trip),
(:Stop)<-[:IS_LOCATED_AT]-(:Stoptime)-[:IS_PART_OF]->(:Trip)
(:Stop)-[:TRANSFER]->(:Stop)
(st1:Stoptime)-[:CONNECTION]->(st2:Stoptime)

:Stop有财产stop_id

:Trip有性质startValidDate, endValidDate, tripExceptions. 旅行仅在某些工作日有效。这些日子表示为属性,例如:monday: true, sunday: false. 每个行程有两个停止时间(出发和到达)。

:Stoptime可以具有以下属性:如果停止时间是出发事件(如st1),则:Stoptime具有属性depatureTine,否则 st :Stoptimeoptime 具有属性arrivalTime

每个:Stoptime都有st_id

[:CONNECTION][:TRANSFER]拥有财产duration

在以下查询中,我尝试查找两者之间的路径:Stop

MATCH (o:Stop)<-[:IS_LOCATED_AT]-(sto:Stoptime)-[:IS_PART_OF]->(tro:Trip)
WHERE o.stop_id=1000001
AND tro.startValidDate<"2019-04-25"
AND tro.endValidDate>"2019-04-25"
AND NOT "2019-04-25" IN tro.tripExceptions
AND tro.thursday=true
WITH sto, o
MATCH (d:Stop)<-[:IS_LOCATED_AT]-(std:Stoptime)-[:IS_PART_OF]->(trd:Trip)
WHERE d.stop_id=1000004
AND trd.startValidDate<"2019-04-25"
AND trd.endValidDate>"2019-04-25"
WITH sto, std, o
MATCH p=((sto)-[*]-(std))
WHERE NOT o IN nodes(p)
AND NONE (y in relationships(p) WHERE type(y)="IS_PART_OF")
RETURN p

这个查询效果很好。但是我必须检查路径包含关系的情况[:TRANSFER],如果下一次旅行在到达日有效。

例如,我有查询后的路径:

path=((sta1:Stoptime)-[c:CONNECTION]->(sta2:Stoptime)-[:IS_LOCATED_AT]->(s1:Stop)-[t:TRANSFER]->(s2:Stop)<-[:IS_LOCATED_AT]-(std3:Stoptime)-[:CONNECTION]->(sta2:Stoptime))

和:

(sta1:Stoptime)-[:IS_PART_OF]->(a:Trip)
(sta2:Stoptime)-[:IS_PART_OF]->(a:Trip)
(stb1:Stoptime)-[:IS_PART_OF]->(b:Trip)
(stb2:Stoptime)-[:IS_PART_OF]->(b:Trip)

该路线于周四开始。我必须检查:

if (x in relationships(path) WHERE type(z)="TRANSFER"):
    if (the sum of duration of all connections between previous stoptimes + duration of transfer > 24) AND (b.friday=true): return path
    else if (b.thursday=true): return path
else return null

我不知道,我怎么能用 Cypher 写这个。还是在业务层中抛出所有路径并检查这种情况会更好?

我想,也许在传输之间将路径分成子路径会更好?

标签: neo4jcypher

解决方案


推荐阅读