2013-02-15 2 views
2

특정 속성이있는 노드와 관련이없는 노드를 필터링하려고하는 상황이 있습니다. 예를 들어, 모든 사람들에게 나를 알리는 쿼리가 있지만 갈색 모피가있는 개가있는 필터 만 필터링하려고한다고 가정 해 보겠습니다.관련 노드의 속성을 기반으로하는 필터

//For simplicity's sake, assume nodes 1,2,3 are the potentials I care about 
START person=node(1,2,3) 
WHERE person-[:has]->(dog{furColor:"Brown"}) // <-- would be nice to use 
RETURN person 

그러나이 작동하지 않습니다 내가 무엇을 같은 것은이 같은 것입니다. 구문 분석기는 명시 적으로 다음과 같이 알려줍니다.

패턴 요소의 등록 정보는 MATCH에서 허용되지 않습니다.

("WHERE"를 사용할 때 "MATCH"를 참조하는 것이 좋지만 무엇이든). 따라서이 방식으로 노드의 속성을 참조 할 수 없습니다. 다른 옵션은 무엇입니까? 나는 ...

START person=node(1,2,3) 
MATCH person-[:has]->dog 
WHERE dog.furColor! = "Brown" 
RETURN person 

경기 절에 추가하여 내가 원하는 것을 모방 할 수 있었다 ...하지만 내가 추가 경로와 일치하고 밖으로 다시 그들을 필터링이 나에게 이상하고 비효율적 인 것 같다. 다른 방법이 있습니까?

답변

1

그래프 디자인에 WHERE 절을 사용하는 다른 방법은 없습니다.

그러나 변경할 수 있다고 생각하면 실제로 furColor 속성을 Brown 노드와 연결할 수 있습니다. 따라서 속성에 정보를 유지하는 대신 모든 색상에 대해 추가 노드를 만들 수 있고 dog 노드를 furColor 유형과 해당 색상 노드와의 관계로 연결하는 것 이상으로 사용할 수 있습니다. (시작 단계에서 갈색 노드를 지정할 때) MATCH person-[:has]->dog-[:furColor]->brown 같은 MATCH 절에 대한 쿼리가 더 빠릅니다.

+0

흥미로운 아이디어입니다. 나는 그것이 실제적인 문제에 대해서는 적절하지 않다고 생각하지만, 고려할 가치가있는 해결책입니다. 감사. – ean5533

+0

참고로, START 절 바로 다음에 WHERE를 사용할 수 있습니다. 이 특정 시나리오에서는 dog 노드가 MATCH 부분에 지정되었으므로 그렇지 않을 수 있습니다. 그렇지 않으면 START 절에 지정 될 수있는 경우 WHERE로 필터링 할 수 있습니다. – ulkas

0

시도해 볼 수는 있지만 일치하는 성능을 기준으로 측정 할 수 있습니다.

경로 표현식은 경로 모음을 반환하며 컬렉션 함수는 extract이고 컬렉션 술어는 all이며 경로 컬렉션에서 작업 할 수 있습니다.

START person=node(1,2,3) 
WHERE ALL(dog in extract(path in person-[:has]->() : last(path) // last node of path 
      WHERE dog.furColor! = "Brown" 
     ) 
RETURN person 
관련 문제