2017-12-01 1 views
1

나는 cypher를 사용하여 neo4j에서 일련의 데이터 노드를 유지하려고합니다. 그래서 현재 날짜와 타임 스탬프가있는 노드를 만듭니다. 또한 현재 노드와 가장 최근의 노드 사이에 연결을 만들어야합니다. 그래서 노드가있는 경우 노드가 이미 존재하는지 확인하고 최신 날짜가있는 노드를 가져와 (latest:Node)<-[:next]-(prev:Node)을 만듭니다. 노드가 존재하지 않으면 현재 날짜가있는 노드를 만듭니다. 감사합니다.최근 날짜가 있고 현재 노드와의 연결을 생성하는 neo4j 노드 (있는 경우)를 얻는 방법은 무엇입니까?

+0

만들기 전에 확인한 내용에 대해 자세히 설명해 주실 수 있습니까? 기본적으로, 나는 어딘가에'선택 사항 (x : SomeLabel)의 행을 따라 x가 x가 아닌 NULL이 생성된다 ... ' –

답변

3

가장 최근 노드를 가리키는 어떤 종류의 헤드 노드가있는 경우 유지 관리가 더 쉽습니다. 이렇게하면 가장 최근 노드를 빠르게 찾을 수있을뿐만 아니라 (목록에 몇 개의 노드가 있더라도 일정 시간이 유지됨)이 목록에 대한 동시 변경을 조정하는 데 도움이됩니다.

다음과 같이 머리글 노드를 가정합니다. 가장 최근 노드와 최근 관계. 동시 쿼리가 실행될 때 경쟁 조건을 피하기 위해 가장 최근의 노드를 확인하기 전에 Head 노드를 잠글 필요가 있습니다.

가장 쉬운 방법은 APOC Procedurescall apoc.lock.nodes()입니다.

// assume `latest` node with latest timestamp is already created and in scope 
WITH latest 
MATCH (head:Head) 
CALL apoc.lock.nodes([head]) // avoid race conditions 
OPTIONAL MATCH (head)-[r:LATEST]->(prev) 
WITH latest, head, r, prev // this + the WHERE needed to halt query if latest isn't newer than prev 
WHERE COALESCE(prev.timestamp, 0) < latest.timestamp 
DELETE r // update :LATEST relationship 
MERGE (head)-[:LATEST]->(latest) 
WITH latest, prev 
WHERE prev IS NOT NULL // protects from error in case when prev is null 
MERGE (latest)<-[:next]-(prev) 

새로 만든 노드는 현재 가장 최근의 노드 때이 작동하는 동안 것으로,이 prev보다 최신없는 노드에 대해 작동하지 않습니다 유의하십시오. 이 경우 목록에 추가되지 않습니다. 목록의 적절한 위치에 노드를 삽입하기 위해 쿼리를 수정해야합니다.

+0

고마워! 만약 우리가 처음으로 노드를 생성한다면, 이전 노드가 없다 (최신). 또한 많은 노드가 없어 복잡성이 문제가되지 않습니다. 감사합니다 – Neo

+0

이전 노드가 없어도 쿼리가 작동해야합니다 (헤드 노드가 필요합니다.) – InverseFalcon

+0

Thanks #InverseFalcon. 작동합니다. – Neo

관련 문제