2017-02-19 10 views
0

W, T, L 전문 지식 (숙련도) 및 기타 직원이있는 X, Y, Z 스킬이 필요한 공개 역할 간의 유사성을 계산하고 싶습니다. 직원은 모든 X, Y, Z 스킬을 가지므로 스킬이 없으면 0을 입력해야합니다. ... 이후로 근무하지 않는 이유는 역할과 종업원 모두가 기술. 어떤 생각? 미리 감사코사인 유사성 동일한 크기를 가져야하는 벡터

MATCH (p1:Employee)-[x:HAS_SKILL]->(sk:Personal_Skill)<-[y:REQUIRES_SKILL] -(p2:Role {name:'Role 1-Analytics Manager'}) 
WITH SUM(x.proficiency * y.proficiency) AS xyDotProduct, 
SQRT(REDUCE(xDot = 0.0, a IN COLLECT(x.proficiency) | xDot + a^2)) AS xLength, 
SQRT(REDUCE(yDot = 0.0, b IN COLLECT(y.proficiency) | yDot + b^2)) AS yLength, 
p1, p2 
MERGE (p1)-[s:SIMILARITY]-(p2) 
SET s.similarity = xyDotProduct/(xLength * yLength) 
RETURN p1.name, s.similarity 

답변

0

이 하나의 핵심은 옵션 MATCH의 여러 가지, 사용으로 일치를 깨고, 및 null에 대한 기본 값을 얻기 위해 COALESCE()를 사용하고 있습니다.

첫 번째 단계는 역할에 필요한 모든 기술을 일치시키는 것입니다.

다음은 모든 직원의 MATCH입니다.

마지막은 직원의 기술에 대한 선택적인 일치입니다. 직원에게 기술이없는 경우 HAS_SKILL 관계에 대한 null이 제공됩니다.

거기에서 우리는 HAS_SKILL이 null 인 곳에서 COALESCE()를 사용하여 기본값 0을 제공하는 능숙함을 얻습니다.

MATCH (sk:Personal_Skill)<-[y:REQUIRES_SKILL] -(p2:Role {name:'Role 1-Analytics Manager'}) 
MATCH (p1:Employee) 
OPTIONAL MATCH (p1)-[x:HAS_SKILL]->(sk) 
WITH p1, COALESCE(x.proficiency, 0) as xProf, y.proficiency as yProf, p2 
WITH SUM(xProf * yProf) AS xyDotProduct, 
SQRT(REDUCE(xDot = 0.0, a IN COLLECT(xProf) | xDot + a^2)) AS xLength, 
SQRT(REDUCE(yDot = 0.0, b IN COLLECT(yProf) | yDot + b^2)) AS yLength, 
p1, p2 
MERGE (p1)-[s:SIMILARITY]-(p2) 
SET s.similarity = xyDotProduct/(xLength * yLength) 
RETURN p1.name, s.similarity 
+0

고마워요. 나는 이것으로 해결할 수 있었고 또한 내가하려고했던 다른 것에 대해 COALESCE를 사용했다. –