18

そのため、neo4j を調べました。そのデータ モデルが私のプロジェクトに非常によく適合する可能性があるため、今後のプロジェクトでそれを使用する可能性があります。ドキュメントに目を通しましたが、この質問に対する回答が必要です。

リレーションシップを一方向に設定できますか?

neo4jの人は映画が好きみたいなのでその続き。次のようなグラフがある場合:

Actor A -> [:Acts in] -> Movie B

ノードのタイプが異なるため、方向は明らかです。

でもホラー映画は好きなので…

Person A -> [:wants_to_kill] -> Person B

この関係は一方向である必要があるため、「A は誰を殺したいのか?」とクエリすると、「Person B は誰を殺したいですか?」とクエリすると、Person B が返されます。私は何も得ません。

双方向の関係が必要な場合もあります

お気に入り:

Person A <-[:has_met] -> Person B

...これは明らかです。

ドキュメンテーションは言う:

Relationships are equally well traversed in either direction. This means that there is
no need to add duplicate relationships in the opposite direction (with regard to 
traversal or performance).

While relationships always have a direction, you can ignore the direction where it is 
not useful in your application.

したがって、ドキュメントによると、デフォルトでは関係には方向性があり、必要に応じてそれを無視できます。

ここからが複雑になります。

次のグラフを検討してください (矢印に注意してください)。

Person A <- [:wants_to_kill] -> Person B
Person B -> [:wants_to_kill] -> Person C
Person C -> [:wants_to_kill] -> Person A

すべての道順を無視すると、[:wants_to_kill]「A / C は誰を殺したいですか?」という誤った結果が返されます。どれを無視する必要があるかを知っていれば、クエリを実行しません。

それで、どうにかしてリレーションシップを双方向に設定することはできますか (それらを作成するとき)、またはこれを 2 つのリレーションシップ (人物 A と B の間) でモデル化する必要がありますか?

4

1 に答える 1

43

Neo4j の関係には常に方向があります。リレーションシップ タイプのセマンティクスに方向が組み込まれていない場合 (たとえば、例has_metから)、リレーションシップの作成時に任意の方向を適用することをお勧めします。次に、暗号の「両方向」(「より大きい/小さい」文字はありません) 表記を使用してクエリを実行します。

start ... match (a)-[:HAS_MET]-(b) ....

対照的に、リレーションシップのセマンティクスに のような方向性がある場合は、wants_to_kill2 つのリレーションシップを使用して、a と b がもう一方を殺したい、またはその逆であることを示す必要があります。上記の例では、4 つの関係が必要です。

Person A -[:wants_to_kill]-> Person B
Person B -[:wants_to_kill]-> Person A
Person B -[:wants_to_kill]-> Person C
Person C -[:wants_to_kill]-> Person A

A があなたを殺したいと思っている人物をすべて見つけるには、次のようにします。

start a=node:node_auto_index(name='A') match a-[:wants_to_kill]->victims_of_a return victims_of_a

A を殺したいと思っているすべての人を見つけるには、次のようにします。

start a=node:node_auto_index(name='A') match murderer_of_a-[:wants_to_kill]->a return murderer_of_a
于 2013-06-01T20:42:38.197 に答える