2015-01-16 25 views
6

Bir ilişkiyi bir düğümden diğerine kopyalamak veya taşımak için herhangi bir yol var mı?Farklı düğümlere tüm ilişkileri taşıma/kopyalama

neo4j merge 2 or multiple duplicate nodes

ve burada:

Copy relationships of different type using Cypher

Ben grafiğin

(a)-[r:FOO]->(b) 
(a)<-[r2:BAR]-(c) 

ben bu desen var ki

burada benzer bir durum var daha sonra başka bir düğüm var, 01 Bir (a) kopyası olabilir veya olmayabilir. Benim düşüncem, düğümlerin bir işlev noktasından kopup kopmadığının bir önemi yok. Sonra düğümleri birleştirmek için bu yaptığını ise grafik şimdi çiftleri varken ilişkileri hareket edebilmek istiyorum

(d)-[r:FOO]->(b) 
(d)<-[r2:BAR]-(c) 

içerdiğini bu yüzden taşımak veya ilişkileri r:FOO kopyalayıp r2:BAR edebilmek istiyorum kopyalamak yerine ve sonra (belki de isteğe bağlı olarak) (a)'u silin. Birden fazla ilişki türü olduğunu ve türlerin ne olacağından emin olmadığımı unutmayın. Bunu aşamalı olarak yapabileceğimin farkındayım, ancak tek bir sorguda yapmanın etkili bir yolu olsaydı harika olacağını düşündüm. Benim şu anki stratejisi

// get all outgoing relationships 
MATCH (a:Label1 { title : 'blah' })-[r]->(o) 
RETURN r 
// returns FOO and BAR 

// for each relationship type, create one from (d) and copy the properties over 
MATCH (a:Label1 { title : 'blah' })-[r:FOO]->(o), (d:Label1 { title : 'blah blah' }) 
CREATE (d)-[r2:FOO]->(o) 
SET r2 = r 
...etc... 

// now do the same for incoming relationships 
MATCH (a:Label1 { title : 'blah' })<-[r]-(o) 
RETURN r 
// returns FOO and BAR 
// for each relationship type, create one from (d) and copy the properties over 
MATCH (a:Label1 { title : 'blah' })<-[r:FOO]-(o), (d:Label1 { title : 'blah blah' }) 
CREATE (d)<-[r2:FOO]-(o) 
SET r2 = r 
...etc... 

// finally delete node and relationships (if required) 
MATCH (a:Label1 { title : 'blah' })-[r]-(o) 
DELETE r, a 

Ancak bu sorgular ve dolayısıyla işlemlerin bir dizi dayanır (sözdizimi kesin ama sadece bir fikir vermek için değil) gibi bir şeydir. Bir sorguda bunu başarmak çok basittir (benim basit görünümde). Bununla birlikte, bu gibi bir şeye inanmam. Yanlış mıyım?

Herhangi bir fikrin var mı? Bu net değilse ve daha ayrıntılı bir şekilde açıklamaya ve açıklamaya çalışmamı söyleyin.

Bilgi için Neo4j 2.1.6 topluluk sürümünü kullanıyorum (bir .NET uygulamasından neo4jclient ile).

Yanlış anlaşılmadığım sürece ilişkinin yönünü açıklamak için sürecimi tekrarlamak zorunda olduğumu fark ettiniz mi? yani, tüm giden ilişkileri (a)'dan alın, (d)'dan gidenleri yeniden oluşturun ve sonra gelen tüm ilişkiler için aynı işlemi yapın. Yukarıdaki Cypher buna göre düzenlenmiştir.

GÜNCELLEME: Bunun bir boru hayali olduğunu ve mümkün olmadığını tahmin ediyorum. Bunu onaylayan var mı? “Hayır!” Olsa bile kesin bir cevaba sahip olmak iyi olur. Eğer öyleyse Neo4j 'i bu işlevsellik bile makul ve göz önünde bulundurmaya değer mi diye sormayı düşünürdüm.

GÜNCELLEME 2: Fikirlerin eksikliğinden, bunun yapılamayacağını tahmin ediyorum. Araştırmam veya denememde kesinlikle fazla bir şey yok. Bir özellik isteği gibi görünüyor yol gitmek için. Bu işlevselliği son derece kullanışlı bulabilecek tek kişi ben olamam.

+0

Bu özellik güzel olurdu. Ben (düşün) bunu http://stackoverflow.com/questions/32628783/cypher-query-to-take-all-relationships-from-one-node-and-attach-them-to-another –

cevap

1

Ben sadece bu birlikte zincir düşünüyorum:

// get all relationships 
MATCH 
    (a:Label1 { title : 'blah' })-[r]-(o), 
    (d:Label1 { title : 'blah blah' }) 
CREATE (d)-[r2:type(r)]-(o) 
DELETE r, a 

ben hakkında tamamen emin değilim tek şey orada kullanılmakta olduğu type() işlevini kullanmak yeteneğidir.Şimdi deneyeceğim

+0

adresinden çoğaltmış olabilirim. Teşekkürler. Görmek ilginizi çeker. Ben tür (r) ile gitmek zorunda kaldım ama başarısız oldu - onu kullanma şeklim olabilirdi. Çalışırsa zincirleme fikrini sevdim. – ceej

+0

Evet, aynı sorun vardı. Bunun mümkün olduğunu düşünmüyorum. SET kullanmanın bir yolu olabilir, ama şu anda göremiyorum. Ayrıca "İLE" ifadesinin sayısını azaltmak için –

+0

Yep ifadesini azaltmaya da bakabilirsiniz, "İLE" yi kullanmayı düşündüm, ancak bir şeyi kaçırmadığım sürece yalnızca son 'temizleme' adımını kaydetmeyi görebiliyorum? Yoksa bir ifadede her şeyi yapmak için tekrar eden bir şey mi? – ceej

İlgili konular