一般的なアプローチは、すべての希望に到達するために必要な関係/方向パターンを見つけるためにあるブロックのノードを、そしてあなたはすべてのものを持っていたら:自分にブロックノード、試合を:入力、:出力、および::特性ノード。
ここで最も大きな問題は、あなたが従いたいパターンに関する相反する関係の方向性です。 :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