이것은 출발점부터 대답입니다. 우리는 주파수의 가치를 무시 시작하면 나는 당신이 뭔가를 시도 할 수 있다고 생각 :
MATCH (u1:Originator{name:'John'}), (u2:Originator{name:'Sue'})
WITH u1, u2
OPTIONAL MATCH common=(u1)-[:FREQUENCY]->(t:Task)<-[:FREQUENCY]-(u2)
WITH u1, u2, COUNT(common) as intersection
OPTIONAL MATCH (u1)-[:FREQUENCY]->(t:Task)
WITH u1, u2, intersection, COLLECT(DISTINCT t) AS t1s
OPTIONAL MATCH (u2)-[:FREQUENCY]->(t:Task)
WHERE NOT t IN t1s
WITH u1, u2, intersection, t1s + COLLECT(DISTINCT t) AS union
RETURN u1, u2, intersection/union as js
이 확실히 안된 어떻게 든 반복 작업을 일치하지 않는 발견되는 효율성 아마이 있습니다.
쿼리가 수행하는 작업은 두 사용자가 공통으로 갖고있는 작업을 찾고 변수 intersection
에 일반적인 작업 수를 저장하는 것입니다. 그런 다음 각 사용자의 작업을 개별적으로 (선택적으로) 사용하고 union
(COLLECT
은 일치 항목이없는 경우 길이가 0 인 배열을 만듭니다)을 계산하는 데 사용합니다. 최종 반환 명세서에서 해결할 0으로 나누는 문제가있을 수 있습니다.
주파수가 얼마나 영향을 미치는지 말하기는 어렵지만 :Frequency
을 :Completed
으로 바꾸고 완료된 모든 작업 (즉, 'John'과 'Act A'사이의 6 가지 관계)에 대해 새로운 관계를 만드는 것이 더 나을지 궁금합니다.). 이는 intersection
을 지원하는 데 유용하지만 Union
에 대한 흥미로운 의미를 여전히 가지고 있습니다.
감사합니다. 당신의 접근 방식은 Binary Jaccard 형식의 것이고 DIVIDE BY ZERO는 언제나 가능합니다. 그러나 제공된 주파수로 Jaccard Coefficient를 계산하면 사용자가 적어도 하나의 작업을 수행 할 경우 ZERO로 DIVIDE를 완화 할 수 있습니다. – GvanJoic
나는 Jaccard 유사성이 무엇인지 찾아야한다고 고백한다. – JohnMark13