#neo4j #cypher
Вопрос:
У меня есть три массива объектов, как показано ниже:
const org = [
{
id: "orgId1",
name: "first organization"
},
{
id: "orgId2",
name: "second organization"
}
]
const location = [
{
id: "loc1",
name: "Texas"
},
{
id: "loc2",
name: "New York"
}
]
const contacts = [
{
id: "contact1",
name: "James"
},
{
id: "contact2",
name: "John"
}
]
Каков оптимальный способ добавления отношений между ними? Обратите внимание, что массивы имеют одинаковую длину.
Мне нужен запрос на шифр, который может проходить через диапазон от 0 до организаций.длины и добавьте соответствующие связи между каждым элементом в, например, организация[i], контакты[i], местоположение[i]
Я попробовал следующее, но это дает мне взрывоопасную комбинацию, когда первая организация сопоставляется со всеми записями в массиве местоположений и массиве контактов, когда я хочу, это сопоставление один к одному.
UNWIND $orgs as orgs
UNWIND $locations as locs
UNWIND $contacts as contacts
FOREACH (i IN range(0, size(orgs) - 1)
| MERGE (:Organization { id: orgs[i].id })-[r:LOCATED_AT]->(:Location {id: locs[i].id})
| MERGE (:Organization { id: orgs[i].id })-[r:CONTACT_AT]->(:Contact {id: contacts[i].id})
)
Любая помощь будет признательна. Заранее спасибо.
Ответ №1:
Я не думаю, что вам нужно разматывать все массивы
WITH $orgs AS orgs,
$locs AS locs,
$contacts AS contacts
UNWIND $orgs as orgs
FOREACH (i IN range(0, size(orgs) - 1) |
MERGE (org:Organization { id: orgs[i].id })
MERGE (loc:Location {id: locs[i].id})
MERGE (contact:Contact {id: contacts[i].id})
MERGE (org)-[:LOCATED_AT]->(loc)
MERGE (org)-[:CONTACT_AT]->(contact)
)
должен это сделать
Ответ №2:
Решение было опубликовано на официальном сайте Neo4j. Я тоже делюсь здесь.
UNWIND range(0, size($orgs) - 1) as i
with i
MERGE (o:Organization { id: $orgs[i].id })-[r:LOCATED_AT]->(l:Location {id: $locs[i].id})
with o, i
MERGE (o)-[r2:CONTACT_AT]->(l2:Contact {id: $contacts[i].id})
Ссылка на оригинальный ответ