2017-02-19 91 views
0

我想計算需要X,Y,Z技能的開放角色與W,T,L專業知識水平(熟練程度)和不同員工之間的相似程度......但並非全部員工將擁有所有的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的幾個,使用方法和使用COALESCE()來得到一個空的默認值。

第一步是匹配角色所需的所有技能。

接下來是MATCH對所有員工。

最後是一個從員工到技能的可選匹配,如果員工不具備該技能,這將爲我們提供HAS_SKILL關係的空值。

從那裏,我們得到的熟練程度,使用COALESCE()默認爲0,其中HAS_SKILL爲空。

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來處理我正在嘗試的其他事情。 –