Cypher获得有效旅行

时间:2012-10-05 15:43:05

标签: neo4j cypher

假设我有一个图表,它将neo4j中的关系作为关系保存,每个关系都有一个开始时间和结束时间,我需要找到从node1到node2的有效路径。我需要找到遵循relationship1.arrivetime<的约束的这条路径。 relationship2.departime。

有没有办法在MATCH子句中包含此功能,还是我必须使用WHERE子句来文件化现有路径?

2 个答案:

答案 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子句中选择一组关系。会限制你的搜索。