2014-01-12 3 views
0

Я пытаюсь выяснить правильный способ подключения вновь созданных узлов к дополнительным узлам, которые могут или не могут существовать. В принципе, CREATE A и если существует B, LINK B до A и RETURN A. Если B не существует только RETURN A.Связывание дополнительных узлов с запросом Cypher в Neo4j 2.0

Это мой запрос Cypher (дополнительные предложения WITH - это потому, что это часть более крупного запроса и я стараюсь, чтобы убедиться в этом примере код работает точно так же):

CREATE (a:A { foo: "bar" }) 
WITH a 

OPTIONAL MATCH (b:B) 
WHERE a.foo = b.foo 
CREATE UNIQUE b-[:LINK]->a 
WITH a 

RETURN a 

Это не работает, так как CREATE UNIQUE не удается, так как Ь NULL. Кроме того, чтобы разбить его на несколько запросов, есть ли способ сделать это?

ответ

2

Я думаю, вам нужно взломать его с Еогеаспом ...

CREATE (a:A { foo: "bar" }) 
WITH a 

OPTIONAL MATCH (b:B) 
WHERE a.foo = b.foo 
WITH a, collect(b) as bs 
FOREACH(b in bs | CREATE UNIQUE b-[:LINK]->a) 
WITH a 

RETURN a 
+0

работает как шарм. Пытался использовать FOREACH, но он жаловался, что NULL не подходит. Мне не приходило в голову, что сборщик (NULL) сделает трюк. – Bill

+0

Возможно, вы также можете использовать '[b] как bs', если у вас есть много значений, совпадающих в необязательном совпадении, которые могут быть менее нетерпеливыми/более ленивыми. –

+0

Итак, если b - это коллекция, и я делаю [b], она не становится коллекцией коллекций? – Bill

Смежные вопросы