1

これは、ノードの関係がエッジグループの集合であり、エッジグループごとに一度に1つのエッジしか存在できないため、ノードが多数の連結成分に同時に存在するグラフです。ノードが存在するすべての連結成分を見つけることができる必要があります。ノードが存在するすべての連結成分をすばやく見つけるために、このグラフをneo4jに保存するための最良の方法は何でしょうか。これを行うために組み込みのトラバーサルを使用する方法はありますか?

また、この種のグラフの名前はありますか?ヘルプ/アイデアをいただければ幸いです。

アップデート:

はっきりしないのでごめんなさい。すべてのノードは同じタイプです。ノードには可変数のエッジグループがあります。各連結成分に対して、各エッジグループから正確に1つのエッジを選択する必要があります。例を通して説明しようと思います:

Node x1 is related to: (x2 or x3 or x4) AND (x5 or x6) AND (x7)
Node x2 is related to: (x8) AND (x9 or x10)

したがって、x1の最初のエッジグループは、、(x2, x3, x4)2番目のエッジグループは(x5, x6)、、3番目のエッジグループは(x7)です。

したがって、ここに存在するいくつかの接続されたコンポーネントがx1あります:

CC1:

x1 is related to: x2, x5, x7
x2 is related to: x8 x9 

CC2:

x1 is related to: x2, x6, x7
x2 is related to: x8, x9

CC3:

x1 is related to: x3, x5, x7

CC4:

x1 is related to: x3, x6, x7

これであなたの助けに感謝します。

Update2:

この質問に対する答えがあれば、これを実行できると思います 。neo4jを使用したトラバーサルのすべてのステップで、現在のノードの関数として使用する関係タイプを指定するにはどうすればよいですか?

4

2 に答える 2

1

彼らはあなたの質問を理解しています。あなたはいくつかのノードを持っています。それらをXノードと呼びましょう。それらはいくつかのタイプノード(または同様のもの)に接続されています。これらのノードをTノードと呼びましょう。Xノードは複数のTノードに接続できますが、各Tノードへの接続は1つだけ、または各種類のTノードへの接続は1つだけです(ここでの説明は少しあいまいです)。

これをモデル化する方法は、Tノード(の種類)ごとに1つのRelationshipTypeを使用することです。次に、x_node.getRelationships(T_TYPE_ONE、T_TYPE_TWO、... etc ...)を使用して、XノードからすべてのTノードを取得できます。Xノードを変更するときは、各(種類の)Tノードに対して最大で1つの関係しか持てないという不変条件を維持する必要があります。これを行うには、x_node.getSingleRelationship(THE_T_TYPE_YOURE_MUTATING)を使用します。これがnullを返す場合は、そのタイプの新しい関係を追加しても安全です。関係を返す場合は、新しい関係を追加する前に削除する必要があります。

このモデルのASCIIアートの例(私が解釈しているように):

(x1)--T_ONE-->(t1a)   (t1b)<--T_ONE--(x2)--T_FOUR-->(t4a)
 |\                                   |
 \ |---T_TWO-->(t2a)                 /
  \                                 /
   |---T_THREE-->(t3a)<--T_THREE---/

上記の例では、両方のXノードがT_ONEコンポーネントの一部ですが、x1はT_ONEコンポーネントt1aの一部であり、x2はt1bの一部です。これらは両方ともT_THREEコンポーネントt3aの一部であり、x1はT_TWOコンポーネントt2aの一部であり、x2はT_FOURコンポーネントt4aの一部です。この例でのクエリは次のようになります。

Iterable<Relationship> x1_comps = x1.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);
Iterable<Relationship> x2_comps = x2.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);

そして、更新は次のようになります。

void setComponent(Node xNode, RelationshipType tType, Node tNode) {
    Relationship current = xNode.getSingleRelationship(tType);
    if (current != null) current.delete();
    xNode.createRelationshipTo(tNode, tType);
}

私があなたの要件を誤って解釈した場合は私に知らせてください、そして私はあなたの更新された説明を突き刺すことができてうれしいです。

于 2010-03-11T08:50:17.617 に答える
0

もう 1 つのクエリに関しては、neo4j を使用したトラバーサルのすべてのステップで現在のノードの関数として使用するリレーションシップ タイプを指定するにはどうすればよいですか? で、きめの細かい関数の可能性をいくつか指摘しました。 基本的に、トラバーサーを使用せず、より直接的な node.getRelationship* API を使用して、独自の反復を構築してきめ細かい制御を行います。

それはあなたの問題を解決しますか?

/ピーター・ノイバウアー

于 2010-03-12T05:40:15.073 に答える