Neo4j图算法/节点相似度
假设下面这张图 我有一份需要一些技能的工作,通过这份技能清单,我正在寻找的应聘者知道这些技能(我指的是特定工作所需的一套技能)。 这是最简单的部分 这些关系有着多年的经验。正确的结果需要一个where候选人。经验年数>=技能年数。 我想使用这样的程序Neo4j图算法/节点相似度,neo4j,Neo4j,假设下面这张图 我有一份需要一些技能的工作,通过这份技能清单,我正在寻找的应聘者知道这些技能(我指的是特定工作所需的一套技能)。 这是最简单的部分 这些关系有着多年的经验。正确的结果需要一个where候选人。经验年数>=技能年数。 我想使用这样的程序 gds.nodeSimilarity 有一份候选名单和每个候选名单的相似性。 我试过了,但到现在为止运气都不好,能帮我解答这个问题吗 例如: MATCH aa= (job:JobNode{job_id:'feed85b9-041c-4bb5-b4
gds.nodeSimilarity
有一份候选名单和每个候选名单的相似性。
我试过了,但到现在为止运气都不好,能帮我解答这个问题吗
例如:
MATCH aa= (job:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d'})-[r:REQUIRES]->(s:SkillNode)
with job
MATCH bb= (job:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d'})-[r:REQUIRES]->(s:SkillNode)<-[:KNOWS]-(c:CandidateNode)
WITH {item:id(job), categories: collect(id(c))} AS userData
WITH collect(userData) AS data
CALL gds.alpha.ml.ann.stream({ data: data, algorithm: 'jaccard' })
YIELD item1, item2, similarity
return data
MATCH aa=(作业:作业节点{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d'))-[r:REQUIRES]->(s:SkillNode)
有工作
MATCH bb=(作业:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d})-[r:REQUIRES]->(s:SkillNode)您应该从候选项开始,而不是从作业开始。这是因为你是在根据工作所需的技能来比较应聘者之间的相似之处
MATCH (job:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d'})-[r:REQUIRES]->(s:SkillNode)<-[:KNOWS]-(c:CandidateNode)
MATCH (c)-[:APPLIED_FOR]-(job)
WITH {item:id(c), categories: collect(id(job))} AS userData
WITH collect(userData) AS data
CALL gds.alpha.ml.ann.stream({
data: data,
algorithm: 'jaccard'
})
YIELD item1, item2, similarity
return gds.util.asNode(item1).name AS Candidate1, gds.util.asNode(item2).name AS Candidate2, similarity
ORDER BY Candidate1
Result:
╒════════════╤════════════╤════════════╕
│"Candidate1"│"Candidate2"│"similarity"│
╞════════════╪════════════╪════════════╡
│"Leo" │"Manos" │1.0 │
├────────────┼────────────┼────────────┤
│"Manos" │"Leo" │1.0 │
└────────────┴────────────┴────────────┘
MATCH(job:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d')-[r:REQUIRES]->(s:SkillNode)请同时发布您迄今为止尝试的查询。Thank.MATCH(job:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d})-[r:REQUIRES]->(s:SkillNode)可选匹配(job:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d})-[r:REQUIRES]->(ss:SkillNode)我还尝试了另一个过程,请查看查询。将aa=(作业:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d})-[r:REQUIRES]->(s:SkillNode)与作业匹配bb=(作业:JobNode{job_id:'feed85b9-041c-4bb5-b48a-963c9f927e1d})-[r:REQUIRES]>(s:SkillNode)进行匹配,谢谢您的回答。我尝试的是Leo | job | id | 0.66 Manos | job | id | 0.66这是因为他们每个人都有三分之二的必要技能。如果有人有3/3或4/4等,应该返回1如果有人有1/3,应该返回0.33我应该如何进行才能有这个?我可以换成其他程序吗,节点相似性?我想你把相似性函数的含义和简单的百分比计算混为一谈了。不用担心,我会更新我的答案。这是一个很好的问题。答案是一个简单的算法,老式的方法,而不是数据科学。祝你周末愉快!非常感谢你的回答!我会在需要的地方添加一个闭包。关于你说的混合,假设你是绝对正确的,但是我想这是我真正需要的,而不是你建议的老式方式!真的非常感谢你,祝你周末愉快@马诺斯如果你对我的回答感到满意,就投赞成票或接受它。谢谢
MATCH (job:JobNode{job_id:'<id>'})-[:REQUIRES]->(sk:SkillNode)
WITH job, count(sk) as total_skills
MATCH (job)-[r:REQUIRES]->(s:SkillNode)<-[k:KNOWS]-(c:CandidateNode)
MATCH (c)-[:APPLIED_FOR]-(job)
WITH c as candidate, count(s) as skills, total_skills
RETURN candidate.name, round(10^2*skills/total_skills)/10^2 as percent
Result:
╒════════════════╤═════════╕
│"candidate.name"│"percent"│
╞════════════════╪═════════╡
│"Leo" │0.67 │
├────────────────┼─────────┤
│"Manos" │0.67 │
└────────────────┴─────────┘