Добавление связей между массивом массив объектов в шифре Neo4j

#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})
 

Ссылка на оригинальный ответ