2015-06-19 16 views
8

Birçok giden ilişkiyi olan bir düğüme sahip bir grafiğim var. Daha fazla ilişki eklediğimde yeni giden ilişkiler eklemek için gereken süre azalır. Bozunma, ilişkinin zaten mevcut olmadığını kontrol etmek için geçen süreden kaynaklanıyor gibi görünüyor (ilişkileri eklemek için MERGE kullanıyorum).Neo4j Birleştirme sorgusunu bir düğümde birçok ilişkiyle nasıl en iyi duruma getirebilirim?

İlişkilerin hedef düğümlerinin kendileriyle çok az ilişkisi vardır. Neo4j'i, kaynak düğümden değil, hedef düğümden ilişkinin varlığını kontrol etmenin herhangi bir yolu var mı?

Sorunu yeniden oluşturmak için test komut dosyası. 0 ile HAS ilişkisiyle düğüm 0'a bağlı 1000 düğüm ve ardından 1000 düğüm içeren bir düğüm oluşturur. Düğümler eklendikçe yürütme süresi doğrusal olarak artar.

CREATE CONSTRAINT ON (n:Node) ASSERT n.id IS UNIQUE 

UNWIND RANGE(1,1000) AS i 
MERGE (from:Node { id: 0 }) 
MERGE (to:Node { id: i}) 
MERGE (from)-[:HAS]->to 

Eklendi 1001 etiket, 1001 düğümlerini oluşturulan 1001 özellikleri ayarlamak, 1000 ilişkileri, 3496 ms yürütülen deyimi yarattı.

Eklendi 1000

UNWIND RANGE(1001,2000) AS i 
MERGE (from:Node { id: 0 }) 
MERGE (to:Node { id: i}) 
MERGE (from)-[:HAS]->to 
etiketler, 1000 düğümlerini oluşturulan 1000 özellikleri ayarlamak, 1000 ilişkileri, 7030 ms yürütülen deyimi yarattı.

Eklendi 1000

UNWIND RANGE(2001,3000) AS i 
MERGE (from:Node { id: 0 }) 
MERGE (to:Node { id: i}) 
MERGE (from)-[:HAS]->to 
etiketler, 1000 düğümlerini oluşturulan 1000 özellikleri ayarlamak, 1000 ilişkileri, 10489 ms yürütülen deyimi yarattı.

Eklendi 1000

UNWIND RANGE(3001,4000) AS i 
MERGE (from:Node { id: 0 }) 
MERGE (to:Node { id: i}) 
MERGE (from)-[:HAS]->to 
etiketler, 1000 düğümlerini oluşturulan 1000 özellikleri ayarlamak, 1000 ilişkileri, 14390 ms yürütülen deyimi yarattı.

MERGE yerine CREATE kullanılıyorsa, performans çok daha iyidir. İlişkilerin benzersiz olduğundan emin olmak için CREATE kullanamıyorum.

UNWIND RANGE(4001,5000) AS i 
MERGE (from:Node { id: 0 }) 
MERGE (to:Node { id: i}) 
CREATE (from)-[:HAS]->to 

Eklendi 1000 etiket, 1000 düğümlerini oluşturulan 1000 özellikleri ayarlamak, 1000 ilişkileri, 413 ms yürütülen deyimi yarattı.

Not: şifre birleştirme yürütülürken düğüm derecesi henüz kullanımı kadar zeki olmadığı için Neo4j v2.2.2 ile test edilmiştir

cevap

10

olmasıdır. Okumalar için kullanılan COST optimizasyonunda zaten akıllıdır ancak güncellemeler için eski RULE optimizer kullanılır.

CREATE UNIQUE kullanarak & * için sırasını değiştirerek * başarısız biraz onunla etrafında oynama yerine MERGE * hatırladım

COST olsun-derecesini kullanmak yolu-ifadeler kullanmayı denedikten sonra shortestPath aslında hesaba derecesi en alır ve ayrıca Yani o CREATE ile birleştirmeye çalıştık

sağ

soldan gider ve gerçekten iyi çalıştı, burada 100.000 düğümleri için bir örnektir.

neo4j-sh (?)$ CREATE CONSTRAINT ON (n:Node) ASSERT n.id IS UNIQUE; 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Constraints added: 1 
1054 ms 
neo4j-sh (?)$ 
neo4j-sh (?)$ UNWIND RANGE(0,100000) AS i CREATE (to:Node { id: i}); 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Nodes created: 100001 
Properties set: 100001 
Labels added: 100001 
2375 ms 
neo4j-sh (?)$ 
neo4j-sh (?)$ 
neo4j-sh (?)$ MATCH (from:Node { id: 0 }) 
> UNWIND RANGE(1,100000) AS i 
> MATCH (to:Node { id: i}) 
> WHERE shortestPath((to)<-[:HAS]-(from)) IS NULL 
> CREATE (from)-[:HAS]->(to); 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Relationships created: 100000 
2897 ms 
neo4j-sh (?)$ 
neo4j-sh (?)$ 
neo4j-sh (?)$ MATCH (from:Node { id: 0 }) 
> UNWIND RANGE(1,100000) AS i 
> MATCH (to:Node { id: i}) 
> WHERE shortestPath((to)<-[:HAS]-(from)) IS NULL 
> CREATE (from)-[:HAS]->(to); 
+--------------------------------------------+ 
| No data returned, and nothing was changed. | 
+--------------------------------------------+ 
2360 ms 
+0

Teşekkürler, bu çok umut verici görünüyor. Test edeceğim ve nasıl gideceğini size bildireceğim. – Dave

+0

Çalıştı mı? eğer öyleyse, lütfen kabul edin :) –

+1

Bunu test ettim ve bize büyük bir performans artışı sağladı. Sorgu planlayıcısının bu optimizasyonu otomatik olarak yapabilmesi için bekliyorum. Tekrar teşekkürler Michael :) – Dave

İlgili konular