2017-10-23 7 views
0

특정 노드에서 시작하여 상호 연결이 높은 그래프가 있습니다 관계 유형, 방향 또는 관계없이 모든 노드를 찾으려합니다. 길이. 내가 뭘하려고 하나 이상의 노드를 포함하는 경로를 필터링하는 것입니다. 다음과 같은 관계로고유 한 노드가있는 모든 경로를 찾으려고 할 때 가변 길이 경로로 Cypher 쿼리가 실패 함

CREATE (n1:Person { pid:1, name: 'User1'}), 
     (n2:Person { pid:2, name: 'User2'}), 
     (n3:Person { pid:3, name: 'User3'}), 
     (n4:Person { pid:4, name: 'User4'}), 
     (n5:Person { pid:5, name: 'User5'}) 

:하지만 내가 얻을 것은 나는 다음과 같은 데이터를 사용하여 다시 동일한 메시지를 neo4j 샌드 박스에서 훨씬 간단 데이터베이스 를 작성하고 그럭저럭 가지고

Neo.DatabaseError.General.UnknownError: key not found: UNNAMED27 

입니다

MATCH (n1{pid:1}),(n2{pid:2}),(n3{pid:3}),(n4{pid:4}),(n5{pid:5}) 
CREATE (n1)-[r1:RELATION]->(n2), 
     (n5)-[r2:RELATION]->(n2), 
     (n1)-[r3:RELATION]->(n3), 
     (n4)-[r4:RELATION]->(n3) 

위의 모델에서이 문제를 일으키는 사이퍼 쿼리

입니다
MATCH p= (n:Person{pid:1})-[*0..]-(m) 
WHERE ALL(c IN nodes(p) WHERE 1=size(filter(d in nodes(p) where c.pid = d.pid))) 
return m 

누구든지이 쿼리에 문제가있는 것을 볼 수 있습니까?

+0

테스트 됨 3.2.6이 오류가 여전히 발생합니다. – iltzortz

답변

0

경로를 찾을 때 Cypher는 단일 경로에서 같은 노드를 두 번 방문하지 않습니다. 따라서 MATCH (a:Start)-[*]-(b) RETURN DISTINCT b은 a에 연결된 모든 노드를 반환합니다. (여기서 DISTINCT는 중복되지만 쿼리 성능에 영향을 미칠 수 있습니다. Neo4j 버전에서 PROFILE을 사용하여 문제가 없는지 확인하십시오.)

참고 : Neo4j 3.2 Cypher 계획자부터 시작합니다. 사이퍼 플래너,이 APOC 함께 할, 또는 경로를 탐색 할 필요가 없습니다 그래서 모든 아이들에게 시작 노드에서 -[:connected_to]-> 관계를 추가 할 수있는 유일한 성능이 좋은 방법의 이전 버전.)

+0

큰 데이터베이스에서이 WHERE 절을 제거하려고했습니다. 결과가 끝나지 않았습니다. 결과를 제한하여 (결과적으로 답변을 얻음) 실제로 몇몇 노드를 두 번 방문하여 주기로 떨어지는 것을 보았습니다. 또한 실제로 쿼리를 수행하려고하기 때문에 프로필이 작동하지 않습니다. 이 UNNAMED27이 더 이상 이름을 제공 할 수없는 명명되지 않은 var 길이 관계를 참조한다는 것을 알게되었습니다. – iltzortz

+0

@iltzortz 어떤 버전의 Neo4j를 사용하고 있습니까? 또한 깊이를'() - [* .. 5] -()'로 제한 할 수 있습니다. – Tezra

+0

@iltzortz WHERE 절은 실제로 MATCH의 시간을 돕지 않습니다. 필터는 초기 필터없는 빠른 검색이 실패하고 깊은 연결 그래프가있는 경우 초기 검색이 쿼리를 잠글 수있는 경우에 적용됩니다. – Tezra

2

오류가 보인다 나에게 벌레처럼. 비슷한 것으로 보이는 closed neo4j issue이 있지만 버전 3.2.1에서 수정 될 예정이었습니다. 3.2.5를 사용하고 있다는 의견이 있으니 아마도 새로운 문제점을 만들어야합니다.

한편,이 쿼리는 보이는 결과를 원하는에 도착해야합니다

MATCH p=(:Person{pid:1})-[*0..]-(m) 
WITH m, NODES(p) AS ns 
UNWIND ns AS n 
WITH m, ns, COUNT(DISTINCT n) AS cns 
WHERE SIZE(ns) = cns 
return m 

당신은 강력하지만, 당신의 가변 길이 경로 검색에 합리적인 상한을 두는 것이 좋습니다. 그렇게하지 않으면 적절한 DB 크기로 쿼리가 이되어이 오래 걸리거나 메모리가 부족해질 수 있습니다.

+0

훌륭한 답장을 보내 주셔서 대단히 감사합니다. 불행히도이 쿼리는 실제 데이터베이스에서 시도 할 때 종료되지 않습니다. 그리고 아마 이것은 내 작은 예제에서 where 절을 사용하지 않으려 고했던 사이클에 해당하기 때문일 수 있습니다. 제공 한 쿼리는 사이클을 피할 수는 없지만이 작은 데이터 세트에서 잘 작동합니다. 네오가 낡은 neo4j 문제처럼 보이면 아마 시간을 알기 만하면됩니다. – iltzortz