2016-03-18 17 views
0

Bir kullanıcı veri tabanımdaki düğümlere başvuran bir dizi UUID iletiyor. Onun USER düğümünü bu diğer düğümlerin her birine bağlamak istiyorum. Zorluk, UUID'lerin bana verildiği sırayı bilmek istiyorum. Uuıdlerin iseNeo4j cypher sorgusunda bir değeri artırma

Yani: [AAA, CCC, BBB], şöyle bir şey yürütmek istiyoruz: Elbette

(user)-[:REL {order: 1}]->(:THING {name:"AAA"}) 
(user)-[:REL {order: 2}]->(:THING {name:"CCC"}) 
(user)-[:REL {order: 3}]->(:THING {name:"BBB"}) 

, birden tablolara yapmak istemiyoruz. Bu listeyi parametre olarak geçmek istiyorum.

MATCH(u:USER {id:{id}}) 
MATCH(t:THING) where t.name in {that_list} 
CREATE (u)-[:REL {order: ???}]->(t) 

Not ???. Bu vahşidir.

Bu nasıl başarılabilir? Bir döngü kullanarak testleri geçtim, ama bunu yapabilmem gerektiğini hissediyorum.

+0

Kullanım durumlarınızı bilmiyorum, ancak "THING" düğümlerini sırayla birbirine bağlamayı düşündünüz, böylece "sipariş" özelliklerine sahip olmanıza gerek yok mu? Bunun gibi: '(kullanıcı) - [: REL] -> (: THING {isim:" AAA "}) - [: REL] -> (: THING {isim:" BBB "}) - [: REL] -> (: THING {name: "CCC"}) '? – cybersam

+0

@cybersam bu çok zekice. Benim durumumda yapabileceğime emin değilim, ama çok grafikli. Bunu sevdim. –

cevap

1

Bu sizin için işe yarayabilecek:

UNWIND
MATCH(u:USER {id:{id}}) 
UNWIND {that_list} AS name 
MATCH(t:THING) WHERE t.name = name 
WITH u, COLLECT(t) AS things 
FOREACH(i IN RANGE(0, SIZE(things)-1) | 
    FOREACH(x IN [things[i]] | CREATE (u)-[:REL {order: i}]->(x))); 

aynı sırada, ayrı bir veri satırda mevcut listenizdeki her öğeyi yapar.

İç FOREACH tek bir düğüm üzerinde sadece "yineleyen". Bu hile kullanılır çünkü CREATE modeli bir düğüm için bir ifade kullanamaz. Bu nedenle, bu mantıksal olarak eşdeğer madde yasal olmayacaktır: FOREACH(i IN RANGE(0, SIZE(things)-1) | CREATE (u)-[:REL {order: i}]->(things[i])).

+0

UNWIND ne yapıyor? Bu satırı silemiyorum ve bunun yerine aşağıdaki WHERE yan tümcesini 't.name IN {that_list}' olarak değiştiremez miyim? –

+0

Yuvalanmış FOREACH'ın n^2 ilişkisinin oluşturulmasına neden olduğu anlaşılıyor. –

+0

1. 'Neo4j aynı sırada satırları yaratacak şekilde UNWIND', Listenizde düzeni uygulamak için vardır. IN IN sözdizimi, sipariş vermeyi garanti etmez. 2. "FOREACH" kelimesi tek bir düğüm üzerinde sadece "yinelenen" dir, bu yüzden sorgu 'O (N^2)' değildir. Bu hile kullanılır çünkü "CREATE" kalıbı bir ifade tarafından oluşturulan düğümleri desteklemez. – cybersam