Я ожидаю, что этот запрос произведет 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.
Я ошибаюсь, думая, что это возможно?
2 ответа
Это очень близко, есть одна вещь, которую нам нужно исправить, чтобы этот запрос работал как положено: область действия вашей source
переменной. Это выходит за рамки в середине вашего запроса на WITH:
...
WITH seed.connections AS connections
...
source
не включен в WITH, поэтому выходит из области видимости. source
в вашей последней строке в MERGE не привязан ни к какому предыдущему узлу, поэтому, если такой шаблон не существует между каким-либо узлом и целью, в качестве начального узла будет создан новый пустой узел отношений.
Чтобы это исправить, нам нужно включить source
в ваш WITH, чтобы он оставался в области видимости:
...
WITH source, seed.connections AS connections
...
Как описывает @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)
Похожие вопросы
Новые вопросы
neo4j
Neo4j - это графическая база данных с открытым исходным кодом (GDB), хорошо подходящая для связанных данных. Пожалуйста, указывайте свою точную версию Neo4j, задавая вопросы. Вы можете использовать его для механизмов рекомендаций, обнаружения мошенничества, поиска на основе графиков, сетевых операций / безопасности и многих других пользовательских случаев. Доступ к базе данных осуществляется через официальные драйверы в Java, JavaScript, Python и .NET или через драйверы сообщества в PHP, Ruby, R, Golang, Elixir, Swift и других.