2017-02-19 4 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(), чтобы получить значение по умолчанию для нуля.

Первый шаг - СОГЛАСОВАТЬ все навыки, необходимые для этой роли.

Далее следует МАТЧАТЬ всех сотрудников.

Последнее является ДОПОЛНИТЕЛЬНЫМ МАТЧЕМ от сотрудника к навыку, который даст нам нуль для отношений HAS_SKILL, если у сотрудника нет навыка.

Оттуда мы получаем знания, используя COALESCE(), чтобы указать значение по умолчанию 0, где HAS_SKILL имеет значение NULL.

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 для других вещей, которые я пытался сделать. –

Смежные вопросы