0

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

有没有办法将此功能包含在 MATCH 子句中,或者我是否必须使用 WHERE 子句来归档我找到的现有路径?

4

2 回答 2

2

您使用 where 子句过滤关系属性。如果您需要对遍历进行细粒度控制,还可以使用 Traverser Java API,请参阅http://docs.neo4j.org/chunked/snapshot/tutorials-java-embedded-traversal.html

于 2012-10-05T23:24:07.280 回答
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根据到达和离开时间的索引在您的子句中选择一组关系。会极大地限制您的搜索。

于 2012-10-06T03:00:24.607 回答