Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j图算法/节点相似度_Neo4j - Fatal编程技术网

Neo4j图算法/节点相似度

Neo4j图算法/节点相似度,neo4j,Neo4j,假设下面这张图 我有一份需要一些技能的工作,通过这份技能清单,我正在寻找的应聘者知道这些技能(我指的是特定工作所需的一套技能)。 这是最简单的部分 这些关系有着多年的经验。正确的结果需要一个where候选人。经验年数>=技能年数。 我想使用这样的程序 gds.nodeSimilarity 有一份候选名单和每个候选名单的相似性。 我试过了,但到现在为止运气都不好,能帮我解答这个问题吗 例如: MATCH aa= (job:JobNode{job_id:'feed85b9-041c-4bb5-b4

假设下面这张图

我有一份需要一些技能的工作,通过这份技能清单,我正在寻找的应聘者知道这些技能(我指的是特定工作所需的一套技能)。 这是最简单的部分

这些关系有着多年的经验。正确的结果需要一个where候选人。经验年数>=技能年数。 我想使用这样的程序
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     │
└────────────────┴─────────┘