2016-03-18 6 views
0

Пользователь передает мне массив UUID, который ссылается на узлы в моей базе данных. Я хочу связать ее узел USER с каждым из этих других узлов. Проблема в том, что я хочу знать порядок, в котором UUID были предоставлены мне.Приращение значения в запросе Cypher Neo4j

Так что, если UUID, являются: [AAA, CCC, BBB], я хочу, чтобы выполнить что-то вроде:

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

Конечно, я не хочу делать это в нескольких операторов. Я хочу передать этот список в качестве параметра.

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

Примечание ???. В этом суть.

Как это можно сделать? У меня есть прохождение тестов с использованием цикла, но я чувствую, что должен это сделать.

+0

Я не знаю ваших случаев использования, но подумал ли вы о цепочке узлов «ВЕЩЬ» в порядке, чтобы вам не нужно иметь свойства 'order'? Например: '(user) - [: REL] -> (: THING {name:" AAA "}) - [: REL] -> (: THING {name:" BBB "}) - [: REL] -> (: THING {name: "CCC"}) '? – cybersam

+0

@cybersam это очень умно. Я не уверен, что смогу это сделать в моем случае, но это очень графу. Мне это нравится. –

ответ

1

Это может работать для вас:

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))); 

UNWIND делает каждый элемент в списке доступных в отдельной строке данных, в том же порядке.

Внутренний FOREACH просто «итерации» по одному узлу. Этот трюк используется, потому что шаблон CREATE не может использовать выражение для узла. Следовательно, это логически эквивалентное положение не было бы законным: FOREACH(i IN RANGE(0, SIZE(things)-1) | CREATE (u)-[:REL {order: i}]->(things[i])).

+0

Что делает UNWIND? Могу ли я удалить эту строку и вместо этого изменить следующее предложение WHERE на 't.name IN {that_list}'? –

+0

Похож, что вложенный FOREACH вызывает создание n^2 отношений. –

+0

1. «UNWIND» предназначен для выполнения заказа в вашем списке, так как neo4j будет создавать строки в том же порядке. Синтаксис 'IN' не гарантирует упорядочение. 2. Внутренний «FOREACH» просто «итерирует» по одному узлу, поэтому запрос не является «O (N^2)». Этот трюк используется, потому что шаблон 'CREATE' не поддерживает узлы, сгенерированные выражением. – cybersam

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