2014-04-30 3 views
1

키퍼로 두 개의 노드 (nodeA와 nodeC) 사이의 관계를 만들고 싶습니다.관계에 대해 'UPSERT'

먼저 관계 (nodeA : OWNS nodeC)가 존재하는지 확인해야합니다. 제거 할 관계가없는 경우 : OWNS 관계 nodeA는 다른 다른 노드 (예 : nodeA : OWNS nodeB)과 가질 수 있으며 nodeA와 nodeC 사이에 OWNS를 만들 수 있습니다.

Cypher를 사용하여 효율적인 방법이 있습니까?

감사합니다.

편집 : 나는 대답을했지만 quicke .. nodeA는 nodeB에 대한 특정 ID를 제공함으로써 둘 이상의 [: OWNS] 관계가있는 경우 노드 B에서 [: OWNS] 만 제거하고 스왑 노드 C와 맞지?

답변

2

나는 Cypher가 MERGE의 "ON CREATE"및 "ON MATCH"에 SET 외에 아무것도 할 수 있다고 생각하지 않습니다.

하나의 방법은 개별 Cypher 쿼리에서이를 수행하는 것일 수 있습니다.

MATCH (nodeA {id: <nodeA_id>})-[r:OWNS]->(nodeB), (nodeC {id: <nodeC_id>}) 
WHERE (nodeB) <> (nodeC) 
MERGE (nodeA)-[:OWNS]->(nodeC) 
DELETE r 

그리고, 모든 가능한 경우, 예를 들어, 당신의 노드를 식별하기위한 라벨을 사용하려고합니까 :

그러나,이 또한 트릭을 할 수 있습니다 NodeA : 사용자. 이렇게하면 일이 크게 빨라질 것입니다.

이 기능이 작동하는지 알려주세요.

HTH

+0

정말 고마워요. nodeA에 nodeB에 대한 특정 ID를 제공함으로써 둘 이상의 [: OWNS] 관계가있는 경우 nodeB에서 [: OWNS]를 제거하고 nodeC로 바꿀뿐입니다. 그리고 '<>'는 무엇을 의미합니까? – KoalaD

+0

첫 질문 : 예. 또한 <>은 "같지 않음"을 의미합니다. 내 대답이 도움이 되었기 때문에 기쁩니다. 이 질문에 대한 대답으로 받아 들여주세요. 감사. – BtySgtMajor