2017-11-01 7 views
0

db에는 태그가있는 태그가있는 리소스가 있습니다. 태그는 다른 태그 내에있을 수 있습니다 (예 : 'neo4j'는 다음과 같이 '데이터베이스'에 연결됩니다 : (neo4j:tag)-[:WITHIN]->(databases:tag)). 모든 태그에 부모가있는 것은 아닙니다. 그들이 (아이들을 통해) 직접 또는 간접적 인 경우 자원이 같은 쿼리와 자원에 연결 반환됩니다가변 길이 관계 및 cpyher를 가진 내부 조인과 동등한 것을 찾으려고 시도

MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag) 
WHERE u.uid IN {includedTags} 
RETURN DISTINCT re; 

이와이 문제는 경우 사용자가 여러 개의 태그를 검색 (예 : 'neo4j'과 '데이터베이스 ') 리소스가 검색 태그와 일치하면 반환됩니다. 내가 원하는 것은 반환 된 모든 리소스와 일치하는 리소스 만 갖는 것입니다. 이렇게하면 확장하지 않고 더 많은 태그를 검색 할 수 있으므로 검색 범위를 좁힐 수 있습니다.

WITH DISTINCT re, count(*) AS connected 
WHERE connected = SIZE({includedSets}) 

내가 확실히하는 방법을 알아낼 수 없습니다 :

는 (직접 모든 검색 태그와 태그 만 반환 자원) 가변 길이 경로를 사용하기 전에 나는 연결된 태그의 수를 추적함으로써이를 달성 여기에 비슷한 것을하십시오.

답변

3

사용은 all predicate function :

MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag) 
WITH re, collect(parent) AS parentTags 
WHERE all(tag IN {includedTags} WHERE tag IN parentTags) 
RETURN re; 

성능 현명한, 이것은 최선의 솔루션이 아닐 수도 있지만, 첫째, 그것이 작동하는지 보자.

당신이 UID를 확인 부모의 이러한 속성을 수집 전달하는 경우 :

MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag) 
WITH re, collect(parent.uid) AS parentTags 
WHERE all(tag IN {includedTags} WHERE tag IN parentTags) 
RETURN re; 

을 자원이 많은 태그가있는 경우,이 최적화가 도움이 될 수 있습니다 :

WITH {includedTags} as includedTags 
UNWIND includedTags as tagId 
MATCH (re:resource)-[:TAGGED_WITH]->(:tag)-[:WITHIN_TAG*0..3]->(parent:tag {uid: tagId}) 
WITH re, includedTags, count(parent) AS parentTags 
WHERE size(includedTags) = parentTags 
RETURN re; 
+0

우수함! 이것은 예상대로 작동합니다. 나는 uid 속성 (includedTags는 문자열 uid의 배열)을 기반으로 매칭하고 있는데, 전체 노드에서 매치하는 것보다 빠를 것이라고 생각하니? 성과 향상에 대한 생각이 있다면 그 말을 듣고 싶습니다. 관심이 있다면 쿼리는 knowlo.io에서 생방송입니다. – bornytm

+1

최적화 된 버전을 추가했는데, 속도 향상 여부는 데이터 세트에 따라 다르므로 간단한 벤치마킹을 통해 작동 방식을 확인해야합니다. –