假设我有一个图表,将行程作为关系保存在 neo4j 中,每个关系都有一个开始时间和结束时间,我需要找到从 node1 到 node2 的有效路径。我需要找到符合relationship1.arrivetime <relationship2.departtime 约束的这条路径。
有没有办法将此功能包含在 MATCH 子句中,或者我是否必须使用 WHERE 子句来归档我找到的现有路径?
您使用 where 子句过滤关系属性。如果您需要对遍历进行细粒度控制,还可以使用 Traverser Java API,请参阅http://docs.neo4j.org/chunked/snapshot/tutorials-java-embedded-traversal.html
正如彼得所说,为了检查属性,您需要使用 where 子句。匹配模式用于不检查属性的模式匹配。但是,例如,您可以使用索引来查找从适合特定时间范围的节点开始。
我为您构建了一个示例:
create
(_1 {city:"DC"}),
(_2 {city:"NY"}),
(_3 {city:"SF"}),
(_4 {city:"LA"}),
_1-[:flight {leave:1349431200, arrive:1349445600}]->_2,
_1-[:flight {leave:1349427600, arrive:1349442000}]->_2,
_1-[:flight {leave:1349424000, arrive:1349438400}]->_2,
_1-[:flight {leave:1349420400, arrive:1349434800}]->_2,
_1-[:flight {leave:1349416800, arrive:1349431200}]->_2,
_1-[:flight {leave:1349409600, arrive:1349424000}]->_2,
_2-[:flight {leave:1349431200, arrive:1349445600}]->_3,
_2-[:flight {leave:1349427600, arrive:1349442000}]->_3,
_2-[:flight {leave:1349424000, arrive:1349438400}]->_3,
_3-[:flight {leave:1349431200, arrive:1349445600}]->_4,
_3-[:flight {leave:1349427600, arrive:1349442000}]->_4,
_3-[:flight {leave:1349424000, arrive:1349438400}]->_4,
_3-[:flight {leave:1349438400, arrive:1349445600}]->_4,
_3-[:flight {leave:1349442000, arrive:1349449200}]->_4,
_3-[:flight {leave:1349445600, arrive:1349452800}]->_4;
只是为了好玩,这里有一个查询,显示与目的地匹配的所有航班(过滤之前):http ://console.neo4j.org/r/6ropic 需要有负时差才能成为有效的旅行。
这是一个带有where
子句过滤的查询:
start dc=node(1), la=node(4)
match trip=dc-[dcny]->ny-[nysf]->sf-[sfla]->la
where dcny.arrive < nysf.leave and nysf.arrive < sfla.leave
return dcny.arrive - nysf.leave, nysf.arrive - sfla.leave, dcny.arrive, nysf.leave, nysf.arrive, sfla.leave;
+-----------------------------------------------------------------------------------------------------------+
| dcny.arrive - nysf.leave | nysf.arrive - sfla.leave | dcny.arrive | nysf.leave | nysf.arrive | sfla.leave |
+-----------------------------------------------------------------------------------------------------------+
| -3600.0 | -3600.0 | 1349424000 | 1349427600 | 1349442000 | 1349445600 |
+-----------------------------------------------------------------------------------------------------------+
1 row
0 ms
http://console.neo4j.org/r/79qr9s
如果您想尝试使用可变长度路径来执行此操作,这会有点棘手,但对于这个用例,最多指定几个中途停留可能不是世界末日。
更新:
正在考虑更多 - 您还可以start
根据到达和离开时间的索引在您的子句中选择一组关系。会极大地限制您的搜索。