2017-03-07 14 views
7

2つのラベルPとMがあるとします。Mには名前M1、M2、M3..M10のノードがあります。 Pの50個のノードをMの各ノードに関連付ける必要があります。また、ラベルPのノードはMのノードと2つの関連を持つ必要がありません。サイファーを使用してノードが存在しない場合のノードの作成

これは私が思い付くかもしれないサイファークエリですが、作業。

このようにして、Mの10個のノードすべてに対して実行します。クエリを修正する際の助けに感謝します。

+0

既存のものがありますか:Pと:Mノードの間のOWNS関係、またはこの種の関係を最初に作成するのはこのクエリですか? – InverseFalcon

+0

これは最初の関係です。 –

答えて

3

これは私のために働いた。

MATCH (u:P), (r:M{Name:'M1'}),(s:M) 
where not (s)-[:OWNS]->(u) 
with u,r limit 50 
CREATE (r)-[:OWNS]->(u); 

uとrの制限に言及してくれてありがとうThomas。

5

バッチ処理にはapoc.periodic。*ライブラリを利用できます。常に一つだけ(r)-[:OWNS]->(u)関係があるだろう場合、私は

call apoc.periodic.commit(" 
MATCH (u:P), (r:M{Name:'M1'}),(s:M) where not (s)-[:OWNS]->(u) and not (r)-[:OWNS]->(u) 
with u,r limit {limit} 
CREATE (r)-[:OWNS]->(u) 
RETURN count(*) 
",{limit:10000}) 

を含めるように私の最初のマッチを変更しますdocumentation

call apoc.periodic.commit(" 
MATCH (u:P), (r:M{Name:'M1'}),(s:M) where not (s)-[:OWNS]->(u) 
with u,r limit {limit} 
CREATE (r)-[:OWNS]->(u) 
RETURN count(*) 
",{limit:10000}) 

での詳細情報は、だから、手続きがループ

に分類されます方法はありません
4

このクエリは、すばやくわかりやすくする必要があります。それはCartesian productsを避けるため、それは速いです:

MATCH (u:P) 
WHERE not (:M)-[:OWNS]->(u) 
WITH u LIMIT 50 
MATCH (r:M {Name:'M1'}) 
CREATE (r)-[:OWNS]->(u); 

それは最初の50個の所有されていないPノードに一致します。次に、「所有者」であると考えられるノードMが見つけられ、ノードとノードの間にOWNSの関係が作成されます。このクエリはもっと​​速くするには

所有Mノードが(すべてのMのノードをスキャンせずに)すぐに見つけることができるように、あなたは最初:M(Name)にインデックスを作成することができます。

CREATE INDEX ON :M(Name); 
1

私は接続する1つの方法を考えますすべての10個のノード:1つのクエリ内のM

MATCH (m:M) 
WITH collect(m) as nodes 
UNWIND nodes as node 
MATCH (p:P) where not()-[:OWNS]->(p) 
WITH node,p limit 50 
CREATE (node)-[:OWNS]->(p) 

我々だけにそれを簡素化することができ、収集してくつろぐために必要がある場合、私は本当にわからないが:

MATCH (m:M) 
MATCH (p:P) where not()-[:OWNS]->(p) 
WITH m,p limit 50 
CREATE (node)-[:OWNS]->(p) 
関連する問題