Cypher

2017-03-07 16 views
7

ile mevcut değilse düğümler arasında ilişki oluşturun. 2 etiket P ve M. M'nin M1, M2, M3..M10 adlarına sahip düğümleri olduğunu varsayalım. Her bir N Düğümüyle 50 P düğümünü ilişkilendirmem gerekiyor. Ayrıca P etiketinin hiçbir düğümü, 2 düğümüyle düğümlenmemelidir. M.Cypher

Bu, gelebildiğim daha gerçekçi bir sorudur. iş. Ben M. 10 düğümlerin sorgu düzeltme herhangi bir yardım çalışır

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

Bu şekilde takdir edilmektedir.

+0

Herhangi bir var mı var: OWNS arasındaki ilişkiler: P ve: M düğümleri, veya bu sorgu bu tür ilişkileri yapan ilk kişi mi olacak? – InverseFalcon

+0

Bu ilk ilişkidir. –

cevap

3

Bu benim için çalıştı.

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

Thomas için, u ve r sınırlarını belirtdiğiniz için teşekkür ederiz.

5

Apoc.periodic. * Kitaplığını toplu iş için kullanabilirsiniz. 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}) 

yılında diğer bilgiler her zaman sadece bir (r)-[:OWNS]->(u) ilişki, ben

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}) 

Yani prosedür bir döngü içine düşecek hiçbir şekilde dahil etmek ilk maçımı değiştirecek olacaksa

4

Bu sorgu hızlı ve kolay anlaşılır olmalıdır. o Cartesian products önler çünkü hızlı:

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

İlk 50 sahipsiz P düğümleri eşleşir. Daha sonra, "sahip" olması gereken M düğümünü bulur ve bu her biri ile OWNS arasındaki ilişkiyi oluşturur ve her biri 50 P düğümleri.

CREATE INDEX ON :M(Name); 
1

Ben bağlamak için bir yol düşünüyorum: sahibi M düğüm hızla bulunabilir, böylece

(bütün M düğümleri tarayarak olmadan) bu sorgu daha hızlı, önce :M(Name) üzerinde bir dizin oluşturabilirsiniz yapmak için 10 düğümleri: bir sorguda 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) 

biz sadece bunu basitleştirmek olabilir, toplamak ve gevşemek gerekirse ben gerçekten emin değilim rağmen:

MATCH (m:M) 
MATCH (p:P) where not()-[:OWNS]->(p) 
WITH m,p limit 50 
CREATE (node)-[:OWNS]->(p) 
İlgili konular