2013-11-06 4 views
0

я уже существующие узлы 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 не будет начинаться с частичным совпадением. Но наличие избыточных данных - это запах.

ответ

1

Я создал то, что я думаю, что ваша модель в консоли: http://console.neo4j.org/?id=l6q3q0

Возможно попробовать это:

START a=node:node_auto_index(name='a'), b=node:node_auto_index(name='b') 
WHERE NOT (a<-[:FROM]-(:Comp)-[:TO]->b) 
CREATE a<-[:FROM]-(c:Comp), c-[:TO]->b 
+0

Это точная модель, ваше предложение лучше, чем то, что я сделал с дополнительными отношениями, так что спасибо. Но я, вероятно, был не очень ясен: после создания или поиска c мне нужно новое отношение: CREATE UNIQUE c - [: SUGGESTED_BY] -> (x: Algo) '. Здесь я могу сделать это, если я только что создал c, добавив эту строку к вашему коду, но я не уверен, как это сделать, если c уже существует. – philh

+1

Вы используете Neo 1.9 или 2.0? При использовании 2.0 вы можете использовать выражение CASE WHEN. В противном случае может быть проще использовать два разных запроса. Первое обеспечило бы его существование, второе создало бы следующие отношения. – LameCoder

+0

Я использую 2.0, но похоже, что CASE может иметь только выражения в частях WHEN и не может использоваться с CREATE. (например, 'CREATE CASE 3 WHEN 2 THEN (x: Two) ELSE (x: Three) END', по-видимому, думает, что CASE - это то, что создается, и генерирует синтаксическую ошибку на первом. 3. Мне может потребоваться два запроса , Спасибо за вашу помощь! – philh

Смежные вопросы