Cypher

2013-06-06 13 views
5

kullanarak bir neo4j veritabanına düğüm eklemenin en etkili yolu nedir? Py2neo python kullanarak cypher komutlarını çalıştırarak (gömülmemiş) bir neo4j veritabanına çok sayıda düğüm (~ 500.000) eklemeye çalışıyorum modül (py2neo.cypher.execute). Sonunda, py2neo'ya olan bağımlılığı kaldırmam gerekiyor, ama şu anda cypher ve neo4j hakkında daha fazla şey öğrenene kadar kullanıyorum.Cypher

İki düğüm tipi A ve B var ve düğümlerin büyük çoğunluğu A tipindedir. İki olası ilişki r1 ve r2, öyle ki A- [r1] -A ve A- [r2] -B . A tipi düğümlerin her biri 0 - 100 r1 ilişkilere sahip olacak ve B tipi her düğümün 1 - 5000 r2 ilişkisi olacaktır.

Şu anda büyük CREATE deyimleri oluşturarak düğümler ekliyorum. Örneğin zaman ... grafikte doğrusal bir zincir oluşturan bir başka 5000 ya da düğümler ve ilişkileri olabilecek bir açıklama

CREATE (:A {uid:1, attr:5})-[:r1]-(:A {uid:2, attr:5})-[:r1]-... 

sahip olabilir. Bu işe yarıyor, ama oldukça yavaş. Ben de tüm A tipi düğümleri eklemek sonra

CREATE INDEX ON :A(uid) 

kullanarak bu düğümleri indeksleme ediyorum, tekrar ifadeleri CREATE kullanarak tip B düğümleri ekleyin. En sonunda, bir kaç bin VEYA ifadeleri temsil edebilir ...

MATCH c:B, m:A where c.uid=1 AND (m.uid=2 OR m.uid=5 OR ...) 
CREATE (m)-[:r2]->(c) 

nerede gibi bir ifade kullanarak r2 ilişkileri eklemek çalışıyorum. Bu, saniyede sadece birkaç ilişki ekleyerek gerçekten yavaş görünüyor.

Bunu yapmak için daha iyi bir yol var mı? Buradan tamamen uzak mıyım? this question'a baktım ama bu, düğümleri verimli bir şekilde yüklemek için cypher'in nasıl kullanılacağını açıklamıyor. Baktığım her şey, gerçek cypher sorgularının kullanılabileceğini göstermeden java kullanıyor gibi görünüyor.

cevap

6

(2.0) sonuna kadar endeks oluşturmayın. Düğüm oluşumunu yavaşlatır.

Cypher öğenizde parametre mi kullanıyorsunuz?

Siperiniz her seferinde parametrelerle aynı olmadıkça, çok fazla sayıda ayrıştırma süresi kaybettiğinizi hayal ediyorum. Bu şekilde modelleyebiliyorsanız, belirgin bir performans artışı görürsünüz.

Çoktan sipariş isteğinize zaten çok fazla miktarda parça gönderiyorsunuz, ancak toplu iş isteği API'sı birden fazla REST isteği gönderebilmenizi sağlar; bu da daha hızlı olabilir (deneyin!). Bu tek seferlik bir ithalat ise

Son olarak, toplu-ithalat aracını kullanmayı düşünebilirsiniz - bu o zaman veritabanı dosyaları yükseltebilirsiniz ... hatta kötü donanım üzerinde birkaç dakika içinde 500K düğümler üzerinden yakabilir (Henüz 2.0 dosya oluşturabileceğini sanmıyorum, ancak bu kısa bir süre sonra gelebilir) ve Cypher ile etiketlerinizi/endeksinizi yaratın.

Güncelleştirme: Sonunda MATCH ifadenizi fark ettim. Bunu bu şekilde yapmamalısınız - Ids için OR kullanmak yerine bir kerede bir ilişki yapın. Bu muhtemelen çok yardımcı olacaktır - ve sıvılardan için parametreleri kullandığınızdan emin olun. Bir dizin ipucu kullandığınızda bile Cypher 2.0, OR ile dizin aramaları yapamaz gibi görünmüyor. Belki bu daha sonra gelecek.

Güncelleme Tarihi 2013: 2.0, üzerinde büyük iş hacminde gelişmeler görüldüğü Cypher işlemsel uç noktasına sahiptir.Ben 100-200 ifadeler "exec" boyutları ve toplam 1000-10000 ifadelerin işlem boyutları kullanarak, 20-30k Cypher ifadeleri/saniye göndermek mümkün oldum. Cypher üzerinde yükleme hızlandırmak için çok etkili.

+1

İkinci yorum yazmak istiyorum: parametreler, daha küçük ifadeler, eğer 2.0 kullanıyorsanız, cypher için işlemsel http uç noktasını kullanmayı düşünün, bakınız: http://neo4j.org/develop/labies for cypher & import see: http: //www.neo4j.org/develop/import ve http://jexp.de/blog/2013/05/on-importing-data-in-neo4j-blog-series/ –

+0

Öneri için teşekkürler. Python'dan gelen CREATE ifadeleriyle parametreleri nasıl kullanabileceğimi biliyor musunuz? Parametreler hakkında bulabildiğim her şey Java karma haritaları hakkında konuşuyor. – savagent

+0

Py2neo'da params denen bir sözlük parametresidir. http://book.py2neo.org/en/latest/cypher.html HTTP üzerinden ham JSON yapıyorsanız, sorgu ile JSON isteğine {uid: ...} bir params ekleyebilirsiniz. –

İlgili konular