1

私はneo4jデータベースを使用して人々の間のつながりを追跡しています。3次接続を追跡する必要があります(リンクインがこれを行う方法に似ています)が、パフォーマンスに関するいくつかの問題に直面しました。私のテスト データベースには、最初の注文 (連絡先) の接続が 3 ~ 8 ある約 3,000 人のユーザーがいます。二次接続をフェッチするとき、すべてがパフォーマンスに優れているようです。ただし、3 次接続の取得には時間がかかります。CYPHER クエリを使用してデータをフェッチします。プロファイル ID とそれらの間の接続のみがデータベースに保存されます。

クエリ自体は次のとおりです。

THIRD_ORDER_CONNECTIONS = <<-CYPHER
  START n=node:profile(id='%{id}')
  MATCH n-[:contacts]-common_contact_1-[:contacts]-common_contact_2-[:contacts]-profile
  WHERE common_contact.id <> %{exclude_id} AND common_contact_1.id <> common_contact_2.id
  RETURN COLLECT(DISTINCT profile.id)
CYPHER

私のローカル マシンでは 48 秒かかります。問題は、パフォーマンスを改善したり、クエリを変更して適切な時間に 3 次接続を取得したりするにはどうすればよいかということです。

4

2 に答える 2

1

neo4j バージョン 1.9.M01 で試しましたか? このような単純なパターンの Cypher パフォーマンスが改善され、トラバーサル フレームワークにより多くの作業がオフロードされるという大きな違いが生じる可能性があります。

于 2012-12-04T22:23:43.707 に答える
1

クエリが無効です:common_contact.id識別子に解決されません

  • どのくらいの結果が返ってきますか?
  • クエリに方向を追加すると、クエリ時間はどのように変化し-->ますか?
  • ルビ置換の代わりにパラメータを使用してください。
  • 試してくださいRETURN profile.id(一意のフィルタリングのためにすべてをメモリに保持する必要があります)
  • 通常は cypher が一意性を処理するため、common_contact_1.id <> common_contact_2.id不要な場合があります
于 2012-12-05T01:55:42.340 に答える