2017-08-16 8 views
2

Neo4jは方向性のない関係を許可していません。当然のことながら、何らかの方向性を持つ方向性がない関係をモデル化しました。Neo4jは、自然に方向付けられた関係を自然のものと区別します。

(p1:Person)-[team_member_of]->(p2:Person) 
(p1:Person)<-[team_member_of]<-(p3:Person) 

質問中、私はp1のすべてのチームメンバーを知りたいと思います。これは可能です

MATCH(p1:Person)-[team_member_of]-(Person) 
WHERE id(p1) = someId 

この関係タイプでは、両方向でtraveseに意味があります。照会ながら 他の関係の種類がありますが

(p1:Person)-[driver_of]->(p2:Person) 
(p1:Person)<-[driver_of]-(p3:Person) 

を言って、私はp1のすべてのドライバを知ってほしいです。これを行うことができます

MATCH(p1:Person)<-[driver_of]-(Person) 
WHERE id(p1) = someId 

この場合、私たちは一方向だけで照会する必要があります。

これら2つのユースケースを区別するために、各関係にプロパティを追加しました。 (これはのNeo4jは方向なし関係を許可しない理由の目的を破っての一種である。)

関係が本当に方向/方向性

を持っている場合、私は見つけるために、他の方法を考えることはできませんdirected: true/falseを言ってどのように良い方法でそれを行うための任意の考えですか?

+0

あなたは 'directed:true/false'の関係プロパティをどのような状況で使用していますか? –

+1

この種の知識は通常、DBに格納する必要はありません。開発者は、どちらの関係を双方向として扱うべきか、その理由を示すデータモデルのドキュメントを用意する必要があります。実行時にリレーションシップを指向性として扱うべきかどうかを決定するクエリを書く以外に、選択肢がないことは非常にまれです。 – cybersam

+0

@cybersamありがとうございました。私はその知識を私のAPIに移しました。今や、関係についての財産を維持する必要はありません。私はキャッシュ内の情報を維持し、各要求に対して、キャッシュにチェックインして、指示された/無作為のCypherクエリを作成します。できます! – brownfox

答えて

0

1つの方法は、チームノードを作成し、Teamノードとの関係が「MEMBER_OF」のPersonノードを作成することです。あなたがチームに対してプロパティを格納する必要がある、とあなたのチームメンバー(「ボブ」)の仲間を見つけるための方法を提供しなければならないチームのノードが有用であろう。このような何か:関係は常に持っている傾向がある

MATCH (p:Person {name: "Bob"})-[:MEMBER_OF]->(Team)<-[:MEMBER_OF]-(peer:Person) 
RETURN peer 

ピアツーピアの関係でさえ、通常、いくつかの共通の親を有する。

+0

私のシナリオに合っているかどうかは分かりますが、心に留めておくべきことは間違いありません。ありがとう! – brownfox

関連する問題