2013-06-29 4 views
3

neo4j를 사용하여 연결된 목록을 만들고 관계가없는 루트 노드를 만들려고합니다. 여기에 내가 만들려고하고있는 의사 사이퍼입니다,하지만 난 방법을 잘 모르겠습니다, 또는 그것이 가능하더라도 :cypher (neo4j)와 조건부 관계 만들기

START root=node(1), item=node(2) 
MATCH root-[old?:LINK]->last 
WHERE old IS NOT NULL 
CREATE root-[:LINK]->item-[:LINK]->last 
DELETE old 
WHERE old IS NULL 
CREATE root-[:LINK]->item 

는 기본적으로 나는 목록이있는 경우 목록에 노드를 삽입하려고 간단하고 그렇지 않으면 첫 번째 목록 항목을 만듭니다. 분명히 위에서 한 것처럼 다중 WHERE을 수행 할 수 없습니다. 사이퍼와 함께 원하는 기능을 어떻게 구현할 수 있습니까?

워드 프로세서는 루트 노드에 관계가 반복적으로 발생하여 문제를 해결하지만,이를 수행하지 않고이 문제를 해결하고 싶습니다. 각 노드에 대해 불필요한 관계를 만들 필요가 있습니다.

답변

6

관심있는 사람에게는 위의 내용을 WITH 트릭을 사용하여 해결하는 방법을 알아 냈습니다. 이것은 본질적으로 자기 참조 관계를 만들지 않고도 neo4j에서 연결된 목록을 만드는 솔루션입니다.

START root=node(1), item=node(2) 
MATCH root-[old?:LIST_NEXT]->last 
CREATE root-[:LIST_NEXT]->item 
WITH item, old, last 
WHERE old IS NOT NULL 
CREATE item-[:LIST_NEXT]->last 
DELETE old 

이 기능은 먼저 기존 링크 관계를 찾고 루트에서 항목으로 새 링크를 만드는 방식으로 작동합니다. 그런 다음 WITH을 사용하여 쿼리를 연결하여 일치 된 관계가 실제로 존재하는지 검사 할 수 있습니다. 그랬다면 그것을 제거하고 새 항목에서 이전 항목으로 남은 링크 부분을 만듭니다. http://docs.neo4j.org/chunked/snapshot/query-merge.html#merge-merge-with-on-create-and-on-match

그리고 아마 링크 된 목록의 예에서이를 위해

0
+0

내가 모두 그 문서에보고했다. 내가 말했듯이, 링크드리스트 예제에서는 필자가 피해야 할 반복적 인 관계를 만들어야한다. 'MERGE'는 조건부 CREATE를 수행 할 수 없다는 점을 제외하고는 훌륭 할 것입니다. –