2017-06-06 9 views
1

私はいくつかのグーグルを行い、自分でいくつかのことを試しましたが、私はまだ解決策を見出していません。私は、データベース、Neo4jとcypherをグラフ化するのはむしろ新しいです。Neo4J、cypher:指定されたノードからの一方向のクエリ

添付すると、説明しやすくなります。グラフには、ブロック(ピンク)、入力(緑)、出力(青)、プロパティ(赤)ノードがあり、リレーションシップタイプはPART_OF、connectionsTo、hasInPort、およびhasOutPortです。

block_3からすべてのノードを取得し、[:connectionsTo]リレーションシップの方向に移動したいとします。だから、私が期待しているのは、すべての入力、出力、およびプロパティノードを持つブロック3、2、4、5です。 Block_3の入力も含める必要があります。

私はまだ質問がどのように働くかについての理解がまだ不十分だと思います。クエリがどのように表示されるかを誰かに教えて、クエリのさまざまな部分について説明することができれば、本当に感謝しています。ご出発からブロックノード:

Neo4J database

答えて

1

一般的なアプローチは、すべての希望に到達するために必要な関係/方向パターンを見つけるためにあるブロックのノードを、そしてあなたはすべてのものを持っていたら:自分にブロックノード、試合を:入力、:出力、および::特性ノード。

ここで最も大きな問題は、あなたが従いたいパターンに関する相反する関係の方向性です。 :hasOutPortと:connectionsToはどちらも出力されていますが、これは良いですが:hasInPortの関係は反対方向に向いています。

このトラバーサルを解決する理想的なツールである複数のリレーションシップタイプを使用する可変長関係は、関係するすべてのリレーションシップに対して単一の方向しか指定できないため、問題です。リレーションシップの矢印を省略すると、それはincoming:connectionsToリレーションシップにマッチします。これはあなたが望むものではありません。

オプション1:入力ノードと::ブロックノードの変更関係タイプ/方向

一つの簡単なモデリング修正はとの関係を変えることであろう。代わりに、あなたが現在持っているものの

(:Block)-[:hasInPort]->(:Input) 

あなたが代わりにこの使用することもできます。この変更を行った場合

(:Block)<-[:inPortFor]-(:Input) 

を、あなたはすべての希望、パス同じ方向に移行し、クエリは簡単になります。

// match from starting node to all :Block nodes along desired relationships 
MATCH (:Block{name:'block_3'})-[:hasOutPort|:connectsTo|:inPortFor*0..]->(block:Block) 
// use pattern comprehension to get lists of :Properties, :Input, and :Output nodes per :Block 
WITH block, [(block)-[:PART_OF]->(prop) | prop] as properties, 
[(block)-[:hasOutPort]->(output) | output] as outputs, 
[(block)<-[:inPortFor]-(input) | input] as inputs 
RETURN block, properties, outputs, inputs 

関係方向を変更できない、または変更しない場合は、 en:入力と:ノードをブロックすると、このアプローチ(最初の可変長一致)を取ることができず、別のアプローチが必要になります。

オプション2:APOC手順

APOC Proceduresは非常に有用プロシージャおよび関数のかなりの数とのNeo4jためのプラグインです。これらのうちの1つは、path expanderであり、異なる関係に沿って展開を指定し、それぞれの関係タイプごとにどの方向を従わせるかを宣言することができます。これを使用して、終了ラベルフィルタ(これは、ブロックノードにのみ一致するので、最初の一致を置き換えることができます)。

// match from starting node to all :Block nodes along desired relationships 
MATCH (start:Block{name:'block_3'}) 
CALL apoc.path.subgraphNodes(start, {labelFilter:'/Block', 
relationshipFilter:'hasOutPort>|connectsTo>|<hasInPort'}) YIELD node as block 
// use pattern comprehension to get lists of :Properties, :Input, and :Output nodes per :Block 
WITH block, [(block)-[:PART_OF]->(prop) | prop] as properties, 
[(block)-[:hasOutPort]->(output) | output] as outputs, 
[(block)-[:hasInPort]->(input) | input] as inputs 
RETURN block, properties, outputs, inputs 
関連する問題