2016-02-02 2 views
1

У меня есть схема neo4j, в которой у меня есть 3 узла. например р, б, вNeo4j: Ошибка слияния нескольких отношений

Я хочу написать запрос Merge таким образом, что

MERGE (p)-[:has_b]->(b), 
MERGE (p)-[:has_c]->(c1), 
MERGE (p)-[:has_c]->(c2) 

где c1 и с2 являются примером гр узла, имеющего различные значения свойств.

i.e. Объедините все три отношения.

Если какой-либо из трех запросов слияния создает новый узел, все отношения должны использовать вновь созданный узел p.

я могу добиться этого, если у меня было только два отношения, используя

(c)<-[:has_c]-MERGE (p)-[:has_b]->(b) 

Любые предложения, как сделать это в течение 3 отношений, как в моем случае?

FYI, я использую py2neo, который не помогает вообще.

ответ

1

Узлы не имеют экземпляров. Узел является узлом и имеет метку.

Вы можете MERGE ваши узлы первой, чтобы убедиться, что они существуют, и что все отношения используют один и тот же p:

MERGE (p:LabelA {k: "v"}) 
MERGE (b:LabelB {k: "v"}) 
MERGE (c1:LabelC {k: "v"}) 
MERGE (c2:LabelC {k: "v"}) 
MERGE (p)-[:has_b]->(b) 
MERGE (p)-[:has_c]->(c1) 
MERGE (p)-[:has_c]->(c2) 

Это создаст узлы и отношения только один раз.

+0

это приведет к извлечению p-узла, имеющего {k: v}, который может иметь или не иметь отношения has_b/has_c. В принципе, я хочу, чтобы p-узел проверял его отношения с b, c1 и c2 и возвращал старый p-узел, если все три отношения существуют и имеют одинаковые свойства, и создают новый узел, даже если любое из трех отношений является новым (если свойство end_node отличается, имя отношения может быть одинаковым). Дайте мне знать, если вы хотите, чтобы я объяснил больше. – ajaysingh

+0

похоже на что (c: LabelC {c: 'd'}) <- [: has_c] -MERGE (p: LabelP {p: 'q'}) - [: has_b] -> (b: LabelB {b: 'b'}). Но это касается только двух реалий. Я хочу эту функциональность для 3 realtionships – ajaysingh

+0

в основном я хочу запрос MERGE для 3 отношений в одном запросе – ajaysingh