Создать связь между узлами с таким же свойством в Neo4J - PullRequest
0 голосов
/ 19 января 2019

Я хочу создать новые отношения между двумя актерами, которые родились в том же году.

Я выполняю этот запрос, но, похоже, он не работает:

MATCH (a:Person)
with a AS personA
MATCH (b:Person)
with b AS personB
WHERE personA.born = personB.born AND personA <> personB
CREATE UNIQUE (personA)-[:HAS_SAME_AGE {sameAge: "Has same age"}]-(personB)

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 22 января 2019
  1. В вашем запросе второе предложение WITH не включало personA, поэтому переменная была удалена.
  2. Но оба предложения WITH даже не нужны в вашем запросе, ипоэтому его следует опустить (для ясности, если не для чего-то еще).
  3. Ваш запрос также может очень легко иметь только одно предложение MATCH, которое напрямую использует имена переменных personA и personB.
  4. Ваше предложение WHERE позволит обрабатывать одну и ту же пару узлов Person дважды (в обратном порядке).Вы можете убедиться, что одна и та же пара обрабатывается только один раз, используя, например, ID(personA) < ID(personB) вместо personA <> personB.
  5. CREATE UNIQUE устарело, и вместо него следует использовать MERGE.
  6. MERGE не требует указания направления отношений - он может автоматически назначить его для вас.Это уместно, если вы хотите рассматривать отношения как ненаправленные (что верно в вашем случае).

Вот запрос, который заботится обо всех вышеперечисленных элементах:

MATCH (personA:Person), (personB:Person)
WHERE ID(personA) < ID(personB) AND personA.born = personB.born
MERGE (personA)-[:HAS_SAME_AGE {sameAge: "Has same age"}]-(personB)

Примечание. Вы можете задать логическое значение sameAge (true или false).Или, что еще лучше, просто полностью исключите sameAge, поскольку отношение HAS_SAME_AGE будет существовать только в том случае, если два связанных узла в любом случае будут иметь одинаковый возраст.

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

Этот запрос создаст пустые узлы и создаст отношения между пустым узлом и данным узлом.

Проблема в том, что « personA » не входит в сферу «CREATE UNIQUE».

Вам необходимо передать его вместе с 'personB' в second 'с предложением'.

CREATE UNIQUE не поддерживается в новых версиях Cypher, вместо этого используется MERGE .

MATCH (a:Person)
with a AS personA
MATCH (b:Person)
with personA, b AS personB
WHERE personA.born = personB.born AND personA <> personB
CREATE UNIQUE (personA)-[:HAS_SAME_AGE {sameAge: "Has same age"}]->(personB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...