假设我有一个图表,它将neo4j中的关系作为关系保存,每个关系都有一个开始时间和结束时间,我需要找到从node1到node2的有效路径。我需要找到遵循relationship1.arrivetime<的约束的这条路径。 relationship2.departime。
有没有办法在MATCH子句中包含此功能,还是我必须使用WHERE子句来文件化现有路径?
答案 0 :(得分:2)
使用where子句过滤关系属性。如果您需要对遍历进行细粒度控制,您还可以使用Traverser Java API,请参阅http://docs.neo4j.org/chunked/snapshot/tutorials-java-embedded-traversal.html
答案 1 :(得分:1)
正如彼得所说,为了检查属性,你需要使用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
子句中选择一组关系。会限制你的搜索。