2017-02-19 2 views
0

W、T、Lの専門知識(能力)とdifferente従業員の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

この1の鍵は、オプションMATCHのいくつか、使用方法にあなたの一致を壊し、およびヌルのデフォルト値を取得するために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を使った。 –

関連する問題