Как создать связь только с одним узлом (с похожим именем) в neo4j cypher? - PullRequest
0 голосов
/ 24 января 2019

Я хочу создать базу данных об аэропортах.В каждом аэропорту есть как минимум пять терминалов (названных A, B, C, D и E).Поэтому я хочу, чтобы аэропорт Схипхол включал в себя A, B, C, D, E.Но я создал пять терминалов с именем «A» и, таким образом, если я запускаю этот код:

MATCH (a:Airport{name:"Schiphol"}),(b:Terminal{name:"A"}) CREATE (a)-[r: INCLUDES]->(b)

, он присоединяет каждый терминал A к Схипхолу.Как я могу избежать этого и назначить аэропорту только 1 набор A, B, C, D и E?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 24 января 2019

MERGE будет здесь решением, создавая схему аэропорта, включая терминал, но не создавая: терминальные узлы заранее.

Когда вы используете MERGE для шаблона, и один из узлов уже связан (узел: Airport), а другой нет (терминал:), тогда, если необходимо создать шаблон, будет создан несвязанный узел вдоль с отношениями между узлами. Так вы создаете терминалы для каждого аэропорта.

MATCH (a:Airport{name:"Schiphol"})
MERGE (a)-[:INCLUDES]->(termA:Terminal{name:"A"}) 

А если вы хотите создать все терминалы одновременно для аэропорта:

MATCH (a:Airport{name:"Schiphol"})
UNWIND ['A','B','C','D','E'] as term
MERGE (a)-[:INCLUDES]->(terminal:Terminal{name:term})
0 голосов
/ 24 января 2019

Зачем иметь пять терминалов с именем «А»? Решение может быть:

MATCH (a:Airport{name:"Schiphol"})
MATCH (b:Terminal{name:"A"}) 
WITH a, COLLECT (b) as terminals
WITH a, HEAD(terminals) as terminal 
CREATE (a)-[r: INCLUDES]->(terminal)

(не пробовал) Но это произвольно ...

...