я уже существующие узлы a
и b
, и хочу, чтобы создать путьNeo4j и cypher: как совместить/создать определенные части пути?
(a) <-[:FROM]- (c:Comp) -[:TO]-> (b)
Если это уже не существует. create unique
не совсем здесь работать, потому что если у нас уже есть
(a) <-[:FROM]- (d:Comp) -[:TO]-> (e)
Тогда d
получит повторно использовать в качестве c
, и только получите созданы отношения (c) -[:TO]-> (b)
. В этом случае я хочу создать новый узел :Comp
.
Независимо от того, был ли создан только узел :Comp
, впоследствии я хочу, чтобы create unique
отношения от него.
Я придумал два возможных решений, которые я не особенно нравится:
Я думаю, что я мог бы сделать это с помощью дополнительных отношений, что-то вроде
match (a) <-[r1?:FROM]- (c:Comp) -[r2?:TO]-> (b)
where r1 is null or r2 is null
create (a) <-[:FROM]- (d:Comp) -[:TO]-> (b)
Но я не уверен, как создать дополнительную связь, если узел :Comp
уже существует.
Другой вариант обладает свойствами на c
однозначно идентифицирующие a
и b
, вдоль линий
(a) <-[:FROM]- (c:Comp { from: a.uuid, to: b.uuid }) -[:TO]-> (b)
Так что create unique
не будет начинаться с частичным совпадением. Но наличие избыточных данных - это запах.
Это точная модель, ваше предложение лучше, чем то, что я сделал с дополнительными отношениями, так что спасибо. Но я, вероятно, был не очень ясен: после создания или поиска c мне нужно новое отношение: CREATE UNIQUE c - [: SUGGESTED_BY] -> (x: Algo) '. Здесь я могу сделать это, если я только что создал c, добавив эту строку к вашему коду, но я не уверен, как это сделать, если c уже существует. – philh
Вы используете Neo 1.9 или 2.0? При использовании 2.0 вы можете использовать выражение CASE WHEN. В противном случае может быть проще использовать два разных запроса. Первое обеспечило бы его существование, второе создало бы следующие отношения. – LameCoder
Я использую 2.0, но похоже, что CASE может иметь только выражения в частях WHEN и не может использоваться с CREATE. (например, 'CREATE CASE 3 WHEN 2 THEN (x: Two) ELSE (x: Three) END', по-видимому, думает, что CASE - это то, что создается, и генерирует синтаксическую ошибку на первом. 3. Мне может потребоваться два запроса , Спасибо за вашу помощь! – philh