Я ожидаю, что этот запрос произведет 7 узлов с 21 отношением.

Это производит 13 узлов и 6 отношений

WITH [{address: "1", connections: []},
{address: "2",connections: ["1"]},
{address: "3",connections: ["1", "2"]},
{address: "4",connections: ["1", "2", "3"]},
{address: "5",connections: ["1", "2", "3", "4"]},
{address: "6",connections: ["1", "2", "3", "4", "5"]},
{address: "7",connections: ["1", "2", "3", "4", "5", "6"]}] AS seeds
UNWIND seeds AS seed
MERGE (source:Address { address: seed.address })

WITH seed.connections AS connections
UNWIND connections AS connection
MATCH (target:Address) WHERE target.address = connection

MERGE (source)-[:CONNECTS_TO]->(target)

Я перепробовал более десятка вариантов, включая FOREACH.

Я ошибаюсь, думая, что это возможно?

1
Geoffrey 24 Апр 2017 в 17:20

2 ответа

Лучший ответ

Это очень близко, есть одна вещь, которую нам нужно исправить, чтобы этот запрос работал как положено: область действия вашей source переменной. Это выходит за рамки в середине вашего запроса на WITH:

...
WITH seed.connections AS connections
...

source не включен в WITH, поэтому выходит из области видимости. source в вашей последней строке в MERGE не привязан ни к какому предыдущему узлу, поэтому, если такой шаблон не существует между каким-либо узлом и целью, в качестве начального узла будет создан новый пустой узел отношений.

Чтобы это исправить, нам нужно включить source в ваш WITH, чтобы он оставался в области видимости:

...
WITH source, seed.connections AS connections
...
3
InverseFalcon 24 Апр 2017 в 14:53

Как описывает @InverseFalcon, окончательный запрос выглядит следующим образом

WITH [{address: "1", connections: []},
{address: "2",connections: ["1"]},
{address: "3",connections: ["1", "2"]},
{address: "4",connections: ["1", "2", "3"]},
{address: "5",connections: ["1", "2", "3", "4"]},
{address: "6",connections: ["1", "2", "3", "4", "5"]},
{address: "7",connections: ["1", "2", "3", "4", "5", "6"]}] AS seeds
UNWIND seeds AS seed
MERGE (source:Address { address: seed.address })

WITH source, seed.connections AS connections
UNWIND connections AS connection
MATCH (target:Address) WHERE target.address = connection

MERGE (source)-[:CONNECTS_TO]->(target)
0
Geoffrey 24 Апр 2017 в 15:25