3

私はしばらくの間 Neo4j を使用しており、Neo4j を使用してアプリを起動して実行しています。すべてが非常にうまく機能しており、Neo4j はこの問題を解決するのに非常に優れていますが、今はアプリを拡張する必要があり、しようとしています。 impl。データの Key-Value リストを Neo4j に変換する方法がわかりません。

私はリストを持っています。リストの長さは約700万要素なので、リスト全体をメモリに保存して自分で管理するには少し長すぎます。これをテストしたところ、3Gb を消費します。

私の選択肢は次のいずれかです。

  • (a) Neo4j はこの仕事には不適切なツールであり、実際のキー値データ ストアを使用する必要があります。このデータのリストのためだけに別のデータ ストアを導入する必要があるため、これを行うには少し不利です。
  • (b) キーと値をノードのプロパティとして設定するキー値ごとにノードを作成することにより、Neo4j を使用しますが、これらのノードをグループ化するためのインデックスを持つ以外に関係はありません。キー値のキーを次のように公開します。インデックス上のキー。
  • (c) 単一のノードを作成し、すべてのキー値をプロパティとして保持します。ノードを取得すると、すべてがメモリに読み込まれるため、興味のあるプロパティを検索する必要があるため、これは間違っていると感じます。で、リストを自分で管理することもできます。
  • (d) キーは、実際には 2 つのノードを指す 2 つの部分のキーであるため、関係を作成し、関係のプロパティとして値を設定します。私はこの道を歩み始めましたが、特定のキー/値のルックアップを行うことになると、単純で高速ではないため、これをやめました。

オプション「a」または「b」のいずれかが進むべき道を感じます。
アドバイスをいただければ幸いです。

シナリオ例

ノード A とノード B があり、2 つのノード間に関係があります。ノードはすべて「foo」のプロパティを持ち、foo には何らかの値があります。この例では、ノード A には foo=X があり、ノード B には foo=Y があります。

次に、この K/V のリストを取得します。それらの K/V の 1 つは Key:X+Y=Value:Z です。したがって、元のアイデアは、ノード A とノード B の間に別の関係を作成し、Z を保持する関係にプロパティを格納することでした。次に、「foo」にインデックスを作成します。および新しい関係の関係 idx。

Key X+Y を指定すると、値が取得されます。ルックアップ ロジックは、ノード A (X から) とノード B (y から) を取得し、ノード A の関係をたどって、この新しい関係タイプのノード B をルックアップします。これは機能しますが、特定のタイプを探しているノードとの間のすべての関係を調べなければならないという事実は気に入りません。これは非効率的です。特に、さまざまなタイプの関係が多数ある場合。

したがって、オプション「A」または「B」を使用するという結論、またはNeoで非現実的なことをしようとしています.

4

1 に答える 1

1

Neo4j プロパティに 700 万個のアイテムを格納しようとしないでください。そのとおりです。それは間違いです。

Redis と Neo4j はしばしば適切な組み合わせになりますが、何をしようとしているのか、「d」で何を意味しているのか、よくわかりません。キーと値のペアとは何ですか。グラフの関係?例が役立ちます。

更新: グラフ データベースでこれを行う最も自然な方法は、2 つのノード間のエッジにプロパティとして格納することです。その後、Gremlin を使用してその値を取得できます。

たとえば、いくつかのプロパティを持つ 2 つの頂点 (ノード) の間に存在するエッジのプロパティを返すには、次のようにします。

start = g.idx('vertices')[[key:value]]            // start vertex
edge = start.outE(label).as('e')                  // edge
end = edge.inV.filter{it.someprop == somevalue}   // end vertex
prop = end.back('e').prop                         // edge property
return prop

提案したようにインデックスに保存することもできますが、これによりシステムがさらに複雑になります。トラバーサルの一部としてデータを参照する必要がある場合は、重複データを保存するか、Redis で検索する必要があります。あなたができるトラバーサルについては、次を参照してください。

グラフを歩いている間、Gremlin が Redis とリアルタイムで会話する https://groups.google.com/d/msg/gremlin-users/xhqP-0wIg5s/bxkNEh9jSw4J

更新 2:

頂点の IDabが事前にわかっている場合は、さらに簡単になります。

g.v(a).outE(label).filter{it.inVertex.id == b}.prop

頂点abが事前にわかっている場合、次のようになります。

a.outE(label).filter{it.inVertex == b}.prop
于 2012-06-27T14:47:24.840 に答える