2016-03-22 17 views
1

~ 50m satırlı çok büyük bir XML dosyasına sahibim.Java'ya gömülü neo4j'ye Büyük bir xml dosyasını içe aktarma

XML dosyasının Neo4j Grafik Veritabanı'nı oluşturmaya çalışıyorum. Java uygulaması

1) İthalat XML veri: Ben NetBeans IDE Java kullanıyorum

.
2) Verilere sahip bir Neo4j grafik veritabanı oluşturun.

1. adımda, bir seferde veriyi bir xml etiketi ile veren SAX çözümleyicisi kullanıyorum.

XML etiketleri şunlardır:

1) bir konferans kağıdı. (Dış etiket)
2) Ait olduğu konferans. (İç etiket)
3) Konferans kağıdının yazarları. (İç etiket) Neo4j grafik veritabanını oluştururken aşağıdaki düğümlere ve ilişkiye ihtiyacım var.

1) Her kağıt için yeni bir düğüm oluşturun. (Her kağıt sadece bir kez açıklandığı için kopyalar oluşmaz)
2) Her konferans için yeni bir düğüm oluşturun. (Grafikte yinelenen yok)
3) Her yazar için yeni bir düğüm oluşturun. (Grafikte kopya bulunmamalıdır)

İlişkilerde, her bir kağıt konferansa bağlanmalı ve her yazar yazar tarafından yazılan makalelere bağlanmalıdır.

Örnek:

enter image description here

Bu çok özel bir soru olduğunu biliyorum ama benim soruya mükemmel bir yanıt bekliyor değilim, ben sadece bunu çözmeye yönelik yaklaşımlar arıyorum.

Neo4j için tamamen yeni.

Bu sorunu nasıl giderim? Batch Insertion kullanması tavsiye edildi, ancak bir seferde 1 değer (düğüm) eklerken ve ayrıca grafik db'de yer alan koşulları ve kısıtlamaları da eklerken bunu kullanmak mümkündür. etiketi zaten (bir konferans düğüm zaten varsa, düğümü oluşturmaz, sadece kendi kimliğine göre düğümü bulmak ve ona kağıdı bağlantı) bir düğüm vardır
edin:

Bu

ben düşünüyorum ne yoksa, eğer varsa, düğüm oluşturun. (Varsa, konferans için yeni bir düğüm oluşturun ve ardından kağıdı yeni düğümle ilişkilendirin). Kağıt ve yazarlar için aynı süreç. (Yazar yoksa, yeni bir düğüm oluşturun ve yazarın kağıda bağlanması veya yazar zaten mevcutsa, düğümü bulun ve bu düğümü kağıda bağlayın). Bu süreç ne kadar zaman alır? Bu yaklaşımla devam etmek mümkün mü?

Bu sorunu çözmek için başka hangi seçeneklerim var?

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

Çok önceden teşekkürler.

cevap

2

[GÜNCELLENDİ]

en veri kağıtları, yazarlar ve konferanslar için benzersiz kimlikler vardır diyelim. Olabilecek en az Neo4j veri modeli daha sonra (Sorunuzun gösterilen modeli taklit) şöyle görünebilir:

(:Conf {id: 111, name: 'XYZ Conference 2016'})-[:HAS_PAPER]-> 
    (:Paper {id: 222, name: 'The Theory of Everything'})-[:HAS_AUTHOR]-> 
    (:Author {id: 333, name: 'Albert Einstein IV'}) 

sizin Neo4j istemci böyle her kağıt üzerinde bilgi ile 3 parameters doldurur ise:

{ 
    "conf": {"id": "111", "name": "XYZ Conference 2016"}, 
    "authors": [ 
    {"id": "333", "name": "Albert Einstein IV"}, 
    {"id": "444", "name": "Isaac Newton XVIII"}], 
    "paper": {"id": "222", "name": "The Theory of Everything"} 
} 
böyle

Sonra kağıt için düğümleri ve ilişkileri oluşturmak için sorgu olmazdı şey:

MERGE (c:Conf {id: {conf}.id, name: {conf}.name}) 
CREATE (c)-[:HAS_PAPER]->(p:Paper {paper}) 
FOREACH (x IN {authors} | 
    MERGE (a:Author {id: x.id, name: x.name}) 
    CREATE (p)-[:HAS_AUTHOR]->(a)) 

NOT 1: yukarıdaki MERGE cla kullanımlar, konferans ve yazar isimlerinin asla değişmeyeceğini varsayar. Değişiklik yapabildiyse, name özellikleri ayrı SET maddelerinde ayarlanmalı veya aynı kimlik için birden çok düğüm alınmalıdır.

NOT 2: Eşzamanlı güncelleştirmeler mümkün olduğunda, herkes MERGE kullanıyor olsa bile aynı kimliğe sahip yinelenen düğümler almak da mümkündür. Bu nedenle, yinelenen düğümleri önlemek için :Conf(id), :Author(id) ve :Paper(id) için uniqueness constraints oluşturmalısınız. neo4j, böyle bir kısıtlamayı ihlal eden bir sorguyu iptal eder.

NOT 3: MERGE fıkra CREATE fıkra yaptığı gibi, bu yüzden MERGE maddeleri ayrı ayrı özelliği belirtmek zorunda bir "harita" doğrudan tüm özelliklerini ayarlama desteklemiyor.

+0

Ayrıca üzerinde kısıtlamalar olmalıdır: Conf (id),: Author (id) ve: Paper (id) –

+0

Teşekkürler. Cevabımı güncelledim. – cybersam

+0

Cevap @cybersam bir çok teşekkürler Soruyu ve cevabını sorduğum zaman arasında, düğüm üzerinde benzersiz kısıtlamalar yarattığım ve daha sonra veriyi içine sokmak için MERGE'yi kullandım. Hangi kağıdın hangi yazara ait olduğunu ve hangi konferansın hangi kağıda ait olduğunu öğrenmek için Grafik ve MATCH. Ben sizin önerdiklerinize benzediğini düşünüyorum, ancak kodumun tamamlanması için tahmini 4 günlük bir zaman alacağım. Kodum için biraz daha hızlı çalışabilmem için kullanabileceğim başka bir yaklaşım var (toplu yerleştirme gibi). –

İlgili konular