2016-09-02 3 views
0

모든 경로가 성립 된 관계 속성이있는 두 노드 a와 b 사이의 모든 경로를 검색하기 위해 쿼리를 수행하려고합니다.Neo4j/Cypher : 관계 속성 필터가있는 두 노드 간의 모든 경로

여러 가지 방법으로 시도했지만 성공하지 못했습니다.

일치 p = (o {값 : "a"}) - [r *] - (x {값 : "b"}) 여기서 r.property와 r.property = "foo"는 p

관계 부분 난 [R * ..] 및 기타 여러 옵션을하지만 난뿐만 아니라 짧은하지만 모든 가능성을 원하기 때문에 함수 shortestpath이 날 도움이되지 않습니다

작동하지로 변경되었습니다.

누가 나를 도울 수 있습니까? 아니면 어떤 질문을 말해 줄 수 있습니까?

미리 감사드립니다.

답변

3

당신이 찾고있는 경로의 관계 수집에 ALL 조건은 다음과 같습니다

MATCH p=(o{value:"a"})-[r*]-(x{value:"b"}) 
WHERE ALL(x IN rels(p) WHERE x.property = "foo") 
RETURN p 

그리고 사용하십시오 레이블!

+0

나는 p = (o {value : "a"}) - [r *] - (x {value : "b"})를 시도했다. 어디서나 (r IN rels (p) WHERE r.property = "foo") p를 돌려도 여전히 작동하지 않지만 neo4j는 2 분 이상 걸리고 충돌합니다. 그래프가 너무 커서 많은 시간이 걸리는 것은 정상입니까? 감사! – ddomingo

+1

크리스토프 (Christophe)가 제안했듯이 노드에 레이블을 추가하고, 관계 유형을 지정하고, 색인 및/또는 제약 조건을 지정하여이 쿼리 및 향후 쿼리 속도를 높여야합니다. 작성된 바와 같이,이 쿼리는 db의 모든 노드를 "a"와 "b"값으로 검색합니다 (노드 레이블을 사용하지 않았고 인덱스가 없거나 고유 한 제약 조건을 사용할 수 없기 때문에). 그 (것)들의 사이에 db에있는 각 가능한 경로, 그 후에 거르는. 작성된 바와 같이 큰 DB에 대한 미친 쿼리이므로 충돌이 일어나는 것은 당연한 일입니다. 컨텍스트를 추가하면 번개가 빨리 나타날 수 있습니다. – InverseFalcon

+0

문제는이 쿼리가 여러 번 수행 될 것이므로 인덱스를 사용할 수 없다는 것입니다.이 쿼리는 여러 번 수행되고 어떤 노드 유형도 값이 속하는지 알 수 없으므로 (동일한 값에 대해 두 개의 레이블이있는 경우 일 수 있습니다) 문제가 있습니다. 아이디어는 작은 부분 그래프 내의 모든 경로를 가져 오는 것입니다 (이 하위 그래프를 쿼리하는 데 1 초 이상 걸리지 않습니다). 따라서 하위 그래프를 먼저 검색 한 후에이 쿼리를 다시 수행 할 수 있습니까? RETURN * 이제이 쿼리의 결과 내에서 두 노드 사이의 모든 경로를 검색합니다. 고맙습니다! – ddomingo

관련 문제