2017-01-22 7 views
0

のNeo4jサイファー:例えば、このデータを持つリストの縁

CREATE 
(p1:Person {name:"p1"}), 
(p2:Person {name:"p2"}), 
(p3:Person {name:"p3"}), 
(p4:Person {name:"p4"}), 
(p5:Person {name:"p5"}), 
(p1)-[:KNOWS]->(p2), 
(p1)-[:KNOWS]->(p3), 
(p1)-[:KNOWS]->(p4), 
(p5)-[:KNOWS]->(p3), 
(p5)-[:KNOWS]->(p4) 

私は、P1とP5の間で共通の関係を取得したい:

MATCH (p1:Person {name:"p1"})-[r1:KNOWS]-(p:Person)-[r2:KNOWS]-(p5:Person {name:"p5"}) 
RETURN p, p1, p5 

これは、4つのノードを返します:P1、P3、P4、 p5および4エッジ。

私の目的は、表の行として方向を持つエッジを取得することです。だから、これは作品に思える:

MATCH (p1:Person {name:"p1"})-[r1:KNOWS]-(p:Person)-[r2:KNOWS]-(p5:Person {name:"p5"}) 
RETURN startNode(r1).name AS from, endNode(r1).name AS to 
UNION 
MATCH (p1:Person {name:"p1"})-[r1:KNOWS]-(p:Person)-[r2:KNOWS]-(p5:Person {name:"p5"}) 
RETURN startNode(r2).name AS from, endNode(r2).name AS to 

結果は表です:

from | to 
-----|---- 
p1 | p3 
p1 | p4 
p5 | p3 
p5 | p4 

私の質問は以下のとおりです。

  • それは正しいですか?
  • これを行う最良の方法はありますか?数千のノードがある場合のパフォーマンスを意味します。
  • 共通ノードを3人にしたいのですが?

答えて

2

パフォーマンスを確認する最も良い方法は、PROFILEです。

正しいですか?

あなたがUNIONを行う理由は、私はわからないんだけど、あなたは簡単にパスのチェックを使用することができます。

PROFILE MATCH (p1:Person {name:"p1"}), (p5:Person {name:"p5"}) 
MATCH path=(p1)-[*..2]-(p5) 
UNWIND rels(path) AS r 
RETURN startNode(r).name AS from, endNode(r).name AS to 

は、それはそれを行うための最善の方法ですか?数千のノードがある場合のパフォーマンスを意味します。

一般に、単一のルックアップでパスの開始ノードと終了ノードを一致させることができます(Personノードのラベル/プロパティーペアでインデックス/制約があることを確認してください)。 グラフの次数に応じて、これは大規模な操作になる可能性があります。たとえば、パスの最大深度を制限することによって微調整できます。*..15

共通ノードを3人にしたい場合はどうすればよいですか?

あり、グラフのサイズに応じて複数の方法があります。

a)の場合ではない、あまりにも多くのノード:

マッチ3つのノードが及びALL 3の少なくとも1つの接続を持っている人を見つけます:

PROFILE MATCH (p:Person) WHERE p.name IN ["p1","p4","p3"] 
WITH collect(p) AS persons 
MATCH (p:Person) WHERE ALL(x IN persons WHERE EXISTS((x)--(p))) 
RETURN p 

b)のいくつかのチューニング、一つの共通の3

の最初のノードに直接接続されると仮定

C)は、複数の深さパスにコモンズが必要な場合:

PROFILE MATCH (p:Person) WHERE p.name IN ["p1","p4","p3"] 
WITH collect(p) AS persons 
WITH persons, persons[0] as p1, persons[1] as p2 
MATCH path=(p1)-[*..15]-(p2) 
WHERE ANY(x IN nodes(path) WHERE x = persons[2]) 
UNWIND rels(path) AS commonRel 
WITH distinct commonRel AS r 
RETURN startNode(r) AS from, endNode(r) AS to 

私はあなたのグラフを成長し、試してみることをお勧め/チ​​ューニングユースケース

関連する問題