2017-11-22 14 views
0

이 답변에서 도움이되었지만 고립 된 노드는 관계가없는 단일 노드 (자식 노드)를 의미하지 않습니다. 이 경우 노드 하나가 아예 없습니다. UNWIND rels(path) as relneo4j에서 고립 된 노드를 가져 오지 못했습니다.

이 컬렉션을 풀기 것은 그 기록을 복용 의미하고, : 좋은 말 내가 neo4j에 초보자입니다 도와,이 문제는 이것이다 중대한 호의

answer link

OPTIONAL MATCH path = (x)-[*0..100]->()  
WHERE ID(x) = 65 
UNWIND nodes(path) as node 
UNWIND rels(path) as rel 

WITH collect(distinct node) as nodes,collect(distinct rel) as rels 
// WITH apoc.coll.flatten(collect(nodes(path))) as nodes, apoc.coll.flatten(collect(relationships(path))) as rels 
WITH apoc.coll.toSet([n in nodes WHERE n is not null 
      | { id: id(n),label: labels(n),type:"",metadata: properties(n) } ]) as nodes, 
    apoc.coll.toSet([r in rels WHERE r is not null 
      | { id: id(r),source: id(startNode(r)),relation: type(r),target: id(endNode(r)), directed: "true" } ]) as rels 

RETURN { graph: { type:"",label: "",directed: "true",nodes: nodes,edges: rels, 
     metadata:{ countNodes: size(nodes),countEdges: size(rels) } } } as graph; 

감사

답변

1

것 이를 콜렉션의 요소 당 레코드로 변경하면 레코드가 증가합니다. 콜렉션이 비어있을 때 (고립 된 노드에 대한 관계가 없을 것입니다), 그것은 곱하기 0 번입니다 ... 그것은 빈 콜렉션을 가진 레코드를 지 웁니다.

CASE 문을 사용하여 컬렉션을 빈 컬렉션 대신 null로 대체 할 수 있습니다. 다시 수집 할 때 null이 삭제됩니다. 그것은 당신이 언질 때 기록을 유지합니다.

UNWIND case when size(rels(path)) = 0 then [null] else rels(path) end as rel 
+0

감사합니다. 완벽하게 작동합니다. UNWIND에 관해 자세히 배울 수있을 때 문서/블로그를 공유 할 수 있습니까? –

+0

[UNWIND 관련 문서] (https://neo4j.com/docs/developer-manual/current/cypher/clauses/unwind/)는 다음과 같습니다. 목록을 행으로 확장하는 것은 사실이지만 곱셈 연산이라는 것은 분명하지 않으며 빈 목록은 연결된 행이 지워지는 것을 의미합니다. – InverseFalcon