2017-02-19 3 views
0

Je veux calculer la similarité entre un rôle ouvert qui a besoin de X, Y, Z compétences avec W, T, L niveau d'expertise (compétence) et différents employés ... MAIS pas tous les employés vont avoir toutes les compétences X, Y, Z donc nous aurons besoin de mettre un 0 si la compétence n'est pas présente .... Ce que j'ai n'a pas fonctionné depuis est juste correspondant quand le rôle et l'employé a le compétence. Une idée? Merci à l'avanceSimilitude de cosinus Vecteurs qui doivent avoir la même taille

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 

Répondre

0

La clé de celui-ci se brise en plusieurs de vos matchs, l'utilisation d'un MATCH EN OPTION, et en utilisant COALESCE() pour obtenir une valeur par défaut pour une valeur nulle.

La première étape consiste à MATCH sur toutes les compétences requises pour le rôle.

Suivant est de MATCH sur tous les employés.

Dernier est un MATCH OPTIONNEL de l'employé à la compétence, ce qui nous donnera une nullité pour la relation HAS_SKILL si l'employé n'a pas la compétence. De là, nous obtenons les compétences, en utilisant COALESCE() pour donner un défaut de 0 où HAS_SKILL est nul.

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

Merci beaucoup. J'ai été capable de le résoudre avec ceci et ai également utilisé le COALESCE pour autre chose que j'essayais de faire. –