2016-03-26 29 views
1

FRIEND関係で接続されているノードがあります。 私は毎回そのうちの2つを照会したいので、これを維持するためにSKIPとLIMITを使用します。Neo4j - 特定のノードから一致結果の結果を返します。

しかし、誰かがコールの間にFRIENDを追加した場合、これは(突然「全体リスト」が1つ前のインデックスにプッシュされているので)結果を混乱させます。

例えば、(いくつかのパラメータが注文した)私は友人のリストを持っていたと言うことができます:

A B C D

私が初めて照会ので、私は(0、限られた2をスキップ)Bを取得します。 誰かがEという名前の友人を追加しました。リストは今やE A B C D. です。2番目のクエリはB Cを返します(2をスキップし、2を制限しました)。 skippingメソッドがDBの変更を認識していないため、Bは2回戻されました。

前回のクエリを検討するたびに2を返す方法はありますか?たとえば、Bが最後にクエリから返されたことが分かっていれば、クエリに渡すことができ、Bの代わりにCDを取得して2 NEXTを照会します。

ソリューションと私はSTARTとインデックスについて読んだが、私はこれを行う方法がわからない。

ありがとうございました!

答えて

2

FRIEND関係が作成され、そのプロパティによって注文されたときに、タイムスタンプを保存することができます。 FRIEND関係が作成され

、タイムスタンプのプロパティを追加します。

MATCH (a:Person {name: "Bob"}), (b:Person {name: "Mike"}) 
CREATE (a)-[r:FRIEND]->(b) 
SET r.created = timestamp() 

次に、あなたがcreatedプロパティで注文することができます時に、友人2によってページ付けされています

MATCH (a:Person {name: "Bob"})-[r:FRIEND]->(friends) 
RETURN friends SKIP {page_number_times_page_size} LIMIT {page_size} 
ORDER BY r.created 

あなたはページサイズ(返す友人の数)とスキップする友人の数をこのページに基づいてパラメータ化できます。

+0

返信いただきありがとうございます。しかし、私はこれが問題を解決しないと思う - 私は新しい友人を追加する場合、それはまだ既存のものを前方にプッシュします(スキップによって再クエリされる)。 FROMに特定のタイムスタンプを照会する方法が必要です。それは完全な解決策になります:)それは可能ですか? (最初にタイムスタンプXで誰かに質問したとしますが、タイムスタンプYが新しい場合でも、私はまだXからクエリを開始し、スキップは正しいでしょう)。 – Zephyer

0

申し訳ありませんが、それはあなたに正確に答えていない場合。以前のプロジェクトでは、大きなデータを変更した経験がありました。 1つのクエリですべてを変更することはできませんでしたので、バッチで分割する必要がありました。最初はスキップリミットから始めました。しかし、何らかの理由で、予測できない(すべてのデータを修正していない)場合がありました。その理由を知ることに疲れたら、私は自分のアプローチを変えました。私はデータベースを照会するためにJavaを使いました。だから私はすべての最初のクエリで変更する必要があるIDを取得します。その後、私は格納されたIDを実行します。

関連する問題