2017-01-17 16 views
0

初めてSOとCypherとNeo4jのnewbyを求めています。経路内のノード間のすべてのノードと関係を返す

特定のノードの系統を構成するすべてのノードとすべての関係を取得する必要があります。有向グラフで表示するには、nodesのリストとリレーションシップのリスト(links)が必要です。 result

これは私が研究の時間と試み後に思い付いたものです:: これは私のダミーset of nodesであり、これは私が(ノードプラスリンク)を取得したいものです

MATCH lineage = (n:Sample {name:"P"})-[:CHILD_OF*]->(parent:Sample) 
MATCH (parent)-[r_out]->(child)-[r_in]->(parent) 
WHERE parent IN nodes(lineage) OR child IN nodes(lineage) 
RETURN 
collect(DISTINCT parent) AS nodes, 
collect({ source: parent.name, rel: type(r_out), target: child.name }) AS links_out, 
collect({ source: child.name, rel: type(r_in), target: parent.name }) AS links_in; 

(私は2つを作成しました私は、nと他のすべてのノードの間の可能なすべてのパスを返すと思うので、これはノードのリストでnを返さず、リンクを実際に乗算します。 。

...

任意の助けを私は解決策を見つけ出すことができませんでしたし、私もそれがはるかにエレガントクエリする必要があります確信していますか? おかげ

答えて

0

私はあなたの質問を取得した場合に、私はと思います...(そうでない私の謝罪)

ノードを取得し、戻ってきたすべてのノード間のユニークな関係を得るには、2つの段階でありますプロセス。あなたはhere

は、基本的に最初の要求はあなたのノードを取得し、あなたは関係の両側は、あなたが戻って最初のクエリで得たノードIDの1を持つノードであるすべての関係を照会私の答えを参照することができます

match a-[r]-b where id(a) in [1,2...] and id(b) in [1,2,3...] return r 

整数の配列は、最初のクエリのノードIDと同じ一意のリストです。

0

これは私が探していたものです!

MATCH lineage = (child:Sample {name:"P"})-[:CHILD_OF*]->(parent:Sample) 
MATCH (n:Sample)-[r_out]->(m:Sample)-[r_in]->(n:Sample) 
    WHERE n IN nodes(lineage) AND m IN nodes(lineage) 
RETURN 
    child + collect(DISTINCT parent) AS nodes, 
    collect(DISTINCT {source: n.name, rel: type(r_out), target: m.name}) + 
    collect(DISTINCT {source: m.name, rel: type(r_in), target: n.name}) AS links 

プラス記号は、単一のアレイで結果をマージし、今私は、単一のクエリでnodeslinksの私の二つの配列を持っています! :)

+0

私は理解していないのですが、私は親を持たないノードをターゲットにしているので(なぜなら、出てくる 'CHILD_OF'関係はありません)、私はそのノードを唯一の要素として' nodes '配列? 'lineage'パスに含まれていなくても(この場合のパスは実際には存在しないので)、' name = P'という名前のプロパティを持つ 'child'ノードは定義されていませんか? – Stefano