Предположим, что этот график внизу.

У меня есть работа, требующая определенных навыков, и с этим списком навыков, который я ищу, кандидат знает эти навыки (я имею в виду набор навыков, необходимых для конкретной работы). Это легкая часть.

Отношения имеют атрибут years_of_experience. Для получения правильных результатов требуется, где кандидат.лет_попытки> = навык.год_попытки. Я хотел бы использовать такую ​​процедуру 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
1
Manos Nathanail 25 Фев 2021 в 21:51

1 ответ

Лучший ответ

Вам следует начинать с кандидатов, а не с работы. Это потому, что вы сравниваете сходство между кандидатами на основе навыков, необходимых для работы.

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         │
 └────────────┴────────────┴────────────┘

EDITED: я думал, что вопрос касается алгоритма сходства узлов в библиотеке науки о данных neo4j. Вопрос в том, чтобы рассчитать процент навыков каждого кандидата по сравнению с общим навыком, необходимым для работы.

Шаги:

  1. Получите общее количество навыков, необходимых для работы
  2. Получите всех кандидатов с теми навыками, которые требуются для работы
  3. Убедитесь, что этот кандидат подал заявку на эту работу
  4. Верните имя кандидата и его / ее навыки, разделенные на общее количество навыков, необходимых для этой работы.

ПРИМЕЧАНИЕ: функция round (10 ^ 2/10 ^ 2) - это хитрость в neo4j. Neo4j не может отображать десятичные дроби на рабочем столе. Если вы хотите 3 десятичных разряда, используйте 10 ^ 3

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     │
└────────────────┴─────────┘
0
âńōŋŷXmoůŜ 26 Фев 2021 в 21:02