使用附加过滤器查找节点之间的最短路径

时间:2015-01-20 20:52:02

标签: neo4j cypher

我试图在某些日期对机场之间的航班进行建模。到目前为止,我的测试图看起来像这样:

graph

找到例如LTN和WAW之间的最短路径是非常简单的:

MATCH (f:Airport {code: "LTN"}), (t:Airport {code: "WAW"}), 
p = shortestPath((f)-[]-(t)) RETURN p

这给了我:

enter image description here

但是我不知道如何只获得具有FLIES_ON与给定日期关系的航班的路径。

Link to Neo4j console

3 个答案:

答案 0 :(得分:4)

这是我对你给定模型的处理方式。其他评论者'查询似乎不对,因为他们使用ANY()代替ALL()。您明确表示只需要路径中所有 Flight个节点都附加到Date节点的:FLIES_ON节点的路径:

MATCH (LTN:Airport {code:"LTN"}),
      (WAW:Airport {code:"WAW"}), 
      p =(LTN)-[:ROUTE*]-(WAW)
WHERE ALL(x IN FILTER(x IN NODES(p) WHERE x:Flight) 
          WHERE (x)<-[:FLIES_ON]-(:Date {date:"130114"}))
WITH p ORDER BY LENGTH(p) LIMIT 1
RETURN p

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

答案 1 :(得分:0)

问题是使用shortestPath或allShortestPaths永远不会包含Date节点。

你需要做的是用日期节点过滤模式(我不知道你如何存储日期,所以我将采用Ymd格式:

MATCH (f:Airport {code: "LTN"}), (t:Airport {code: "WAW"})
MATCH p=(f)-[*]-(t)
WHERE ANY (r in rels(p) WHERE type(r) = 'FLIES_ON')
AND ANY (n in nodes(p) WHERE 'Date' IN labels(n) AND n.date = 20150120)
RETURN p
ORDER BY length(p)
LIMIT 1

另一种解决方案,成本更低,就是在比赛中加入日期并用自己建立自己的路径:

MATCH (n:Date {date:20150120})
MATCH (f:Airport {code:"LTN"}), (t:Airport {code:"WAW"})
MATCH p=(f)<-[*]-(n)-[*]->(t)
RETURN distinct(p)
ORDER BY length(p) 

答案 2 :(得分:0)

虽然这不是我对这种数据的首选结构;在回答你的问题时,我可能会这样做。获取路径,过滤路径并获得按长度排序的第一个路径。

控制台测试中的

运行速度比上面建议的快,因为查询计划更简单。

Anyhoo我希望这至少能指出你的方向:)

MATCH (f:Airport { cd: "ltn" }),(t:Airport { cd: "waw" }), p =((f)-[r*]-(t))
WHERE ANY (x IN relationships(p) 
           WHERE type(x)='FLIES_ON') AND ANY (x IN nodes(p) 
                                              WHERE x.cd='130114')
RETURN p
ORDER BY length(p)
LIMIT 1
相关问题