たとえば、neo4jのリレーションシップとしてトリップを保持するグラフがあり、各リレーションシップには開始時刻と終了時刻があり、node1からnode2への有効なパスを見つける必要があるとします。Relationship1.arrivetime<relationship2.departimeの制約に準拠するこのパスを見つける必要があります。
この機能をMATCH句に含める方法はありますか、それともWHERE句で見つけた既存のパスをファイリングする必要がありますか?
関係プロパティをフィルタリングするには、where句を使用します。トラバーサルをきめ細かく制御する必要がある場合は、Traverser JavaAPIを使用することもできます。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
ました。到着時間と出発時間のインデックスに基づいて、句内の関係のグループを選択することもできます。検索を大幅に制限します。