问题描述
下图显示,三分之二的人同时拥有 java 和 PHP 作为技能。 我用这个查询生成了这个图
{
"rows": [
{
"name": "PHP","id": 23776,"entity_id": 23776,"yearsOfExperience": 2
},{
"name": "Java","id": 17477,"entity_id": 17477,"yearsOfExperience": 2
}
]
}
MATCH (s:SkillNode)
WHERE s.entity_id = row.entity_id
with s,row
match (c:CandidateNode)-[r:KNowS]->(s)
where r.years_of_experience<=row.yearsOfExperience
RETURN *;
我应该在查询中更改什么才能接收候选人(果岭),前提是他们拥有行中提供的所有技能?
对于我发布的示例,我不想让候选人“Ena Dyo Tria”而是所有其他人。 如果行不包含 PHP,则“Ena Dyo Tria”用户可能位于图表中。
解决方法
给你:
- 您需要收集所有行和所有技能
- 按行展开行并检查候选人的技能是否包含您想要的所有技能
- 检查与此候选人相关的每项技能是否都在您想要的所有技能列表中(Java 和 PHP)
MATCH (s:SkillNode)
WHERE s.entity_id = row.entity_id
WITH collect(row) as rows,collect(s) as allSkills
UNWIND rows as row
MATCH (c:CandidateNode)-[r:KNOWS]->(s:SkillNode)
WHERE r.years_of_experience <= row.yearsOfExperience AND s in allSkills
WITH c,collect(distinct r) as rels,collect(distinct s) as skills,allSkills
WHERE ALL(sk in allSkills where sk in skills)
RETURN c,rels,skills
Sample result:
╒════════════════╤═════════════╤════════════════════════════════════════╕
│"c" │"rels" │"skills" │
╞════════════════╪═════════════╪════════════════════════════════════════╡
│{"name":"Leo"} │[{},{},{}]│[{"name":"Java"},{"name":"PHP" }]│
├────────────────┼─────────────┼────────────────────────────────────────┤
│{"name":"Manos"}│[{},{"name":"PHP" }]│
└────────────────┴─────────────┴────────────────────────────────────────┘