余弦相似性需要具有相同大小的向量

时间:2017-02-19 16:51:49

标签: neo4j similarity cosine

我想计算需要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

1 个答案:

答案 0 :(得分:0)

这个的关键是将你的MATCH分成几个,使用一个可选的MATCH,并使用COALESCE()来获得一个null的默认值。

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

接下来是所有员工的MATCH。

最后是从员工到技能的可选匹配,如果员工没有技能,这将为HAS_SKILL关系提供空值。

从那里,我们获得了熟练程度,使用COALESCE()给出默认值0,其中HAS_SKILL为空。

class FirebaseClientTest extends SomeClassOfATestFramework {

    val injector = TestInjector(FirebaseClientModule)

    val firebaseClient: FirebaseClient = injector.instance[FirebaseClient]
}