私はneo4j(http://www.neo4j.org/)に人を表すノードを持つグラフを持っています。これらのノードの一部には物理的な位置が保存されています (さまざまなプロパティ: 経度、緯度、location_name、location_id) が、nil の場合もあります。
結果のノードを起点ノードのリストされた物理的な場所からの距離で並べ替える暗号クエリを作成したいと思います。たとえば、経度 -122.419、緯度 37.7793、location_name "カリフォルニア州サンフランシスコ"、および location_id 114952118516947 を持つノード ID 42 で始まるクエリを実行し、物理的な場所 (最短距離) によってノード 42 に最も近い 10 人を取得します。経度と緯度を使用して 2 点間の (おおよその) 距離を計算するためのリソースを見つけたので、それは問題ではありません。
訪問したノードごとにそのような変数を計算し、その変数で結果を並べ替える方法はありますか?
これはおそらく計算コストが高いことを認識しているので、ここで私が仕事をしようとしている代替案があります:
- クエリで、ノードの location_id または location_name が起点ノードのものと一致するかどうかを確認し、それらの一致するノードを最初に並べます。(完全な解決策ではありませんが、短期的にはおそらく受け入れられます)
ORDER BY ( http://docs.neo4j.org/chunked/milestone/query-order.html ) を WITH 演算子 ( http://docs.neo4j.org/chunked/stable /query-with.html )、次のエラーが表示されます。
SyntaxException: Unknown identifier `flag`.
完全なクエリは次のとおりです。
start n = node(42) match (n)<-[:friends]->(f) WITH f, (f.fb_location_id = 114952118516947) AS flag RETURN DISTINCT f ORDER BY flag LIMIT 10
これが不可能な場合、これにアプローチする最善の方法は何ですか?
- [順序付けせずに結果をフィルタリングする] クエリの前に、許容可能な距離 (たとえば 20 マイル) 内にある緯度と経度の組み合わせの範囲を計算し、結果から他のものを除外します。距離を広げたい場合は、別のクエリを作成します。
- [順序付けせずに結果をフィルタリングする] クエリの前に、許容可能な距離 (たとえば 20 マイル) 内にある場所 (都市) を特定し、結果から他の場所を除外します (location_id を使用)。距離を広げたい場合は、別のクエリを作成します。
ありがとうございました!