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})
내가 확실히하는 방법을 알아낼 수 없습니다 :
는 (직접 모든 검색 태그와 태그 만 반환 자원) 가변 길이 경로를 사용하기 전에 나는 연결된 태그의 수를 추적함으로써이를 달성 여기에 비슷한 것을하십시오.
우수함! 이것은 예상대로 작동합니다. 나는 uid 속성 (includedTags는 문자열 uid의 배열)을 기반으로 매칭하고 있는데, 전체 노드에서 매치하는 것보다 빠를 것이라고 생각하니? 성과 향상에 대한 생각이 있다면 그 말을 듣고 싶습니다. 관심이 있다면 쿼리는 knowlo.io에서 생방송입니다. – bornytm
최적화 된 버전을 추가했는데, 속도 향상 여부는 데이터 세트에 따라 다르므로 간단한 벤치마킹을 통해 작동 방식을 확인해야합니다. –