2014-11-05 4 views
2

각 Originator가 수행하는 작업의 빈도를 나타내는 다음 표가 있습니다. (첨부 이미지 참조). [주파수 - -> 작업 Neo4j의 노드 간 유사도 계산

Task-Frequency for each Originators

제가

관계 주관자와 Neo4j 위의 테이블을 나타낸다.

이제 Cypher 쿼리 만 사용하여 두 사용자간에 유사성 (예 : Jaccard Similarity)을 계산해야합니다. 어떻게 그것이 가능하거나 스키마 정의가 모두 변경되는지 알고 싶습니다.

미리 감사드립니다.

답변

1

이것은 출발점부터 대답입니다. 우리는 주파수의 가치를 무시 시작하면 나는 당신이 뭔가를 시도 할 수 있다고 생각 :

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에 대한 흥미로운 의미를 여전히 가지고 있습니다.

+1

감사합니다. 당신의 접근 방식은 Binary Jaccard 형식의 것이고 DIVIDE BY ZERO는 언제나 가능합니다. 그러나 제공된 주파수로 Jaccard Coefficient를 계산하면 사용자가 적어도 하나의 작업을 수행 할 경우 ZERO로 DIVIDE를 완화 할 수 있습니다. – GvanJoic

+0

나는 Jaccard 유사성이 무엇인지 찾아야한다고 고백한다. – JohnMark13