2016-11-08 4 views
1

私は2つのノードタイプからなるグラフモデルを持っています。各USERは、DEPDATAノード(関係に関する重要な情報を保持)を介して1人または複数のUSERに依存しています。オプションのグラフ部分を持つMATCH

(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER) 

-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER) 

をn回繰り返すことができるように、この鎖は、無限の長さを有することができます。これは、ユーザーが何も関係を持っていないことも可能ですので、このすべては、私が取得したいとすると、ウィッヒの深さにかかわらず、特定のユーザーのノードに依存するすべてのユーザノードである

(:USER) 
(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER) 

有効です。

私は既に可変関係の長さについてはhttp://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.htmlについて読んでいますが、直接関係にのみ適用されるようです。

グラフ構造の全体を0..n倍に一致させるにはどうすればよいですか?

+0

「重要な情報」を特定のノードに保存しているのはなぜですか関係は直接ですか?もしあなたがそうでしたら、あなたはvar-length関係を使うことができます。 –

+0

AFAIK私は自分の複雑なJavaクラスではなく、単純なデータ型のみを関係に格納できます。 – Frank

+0

あなたは何を意味するのか分かりません。ノードとリレーションシップは同じプロパティ値をサポートします。どのバージョンのNeo4jをお使いですか? –

答えて

1

上限にはnが使用されていますが、チェーンは無限の長さである可能性があります。この状況では、上限を適用していない場合は、変数を持つ必要はありません。これがゼロ以上に一致します

MATCH (dep:User{ID:123})<-[:DEPENDS_ON|FOR*0..]-(u:User) 
RETURN DISTINCT u 

:私はあなたが探しているものだと思い

は、この(ただし、あなたが一意に依存ユーザーノードを識別しているのプレースホルダとしてIDプロパティを使用して)のようなものです:DEPENDS_ONまたは:FOR関係のチェーンで、すべての異なる従属ユーザーを検索します。

+0

ありがとうございますが、これは要件と一致しないと思います。 USERとDEPDATAは2つの異なるノードタイプであり、グラフの可変部分はそれぞれ " - [:DEPENDS_ON] - >(:DEPDATA) - [:FOR] - >(:USER)"を介した関係です。ここではDEPDATAがどのように考慮されているのか分かりません。 – Frank

+0

変数関係のマッチングに関することは、パス内の中間ノードが重要でないことです。この一致では、次のいずれかが返されます。移動:DEPENDS_ONおよび:FORの関係によって到達可能なユーザーノード:DEPDATAノード(または他のラベルの他のノード)は、そのパスに沿っていてもかまいません。試してみる。 – InverseFalcon

+0

これは本当にうまくいく、いいね、thx – Frank

0

"フル"パスの結果を別のコレクションの "ルート"ノードから開始する場合は、次の操作が必要です。 (「フル」パスは、ルートノードが一方のノードにあり、「リーフ」ノードが他方のノードにあります。)

MATCH p=(u:USER)-[:DEPENDS_ON|FOR*0..]->(root:USER {id: 111}) 
WHERE NOT()-[:FOR]->(u) 
RETURN [n IN NODES(p) WHERE n:USER] AS path_nodes; 
関連する問題