Neo4j 调整查询以返回正确的结果

Neo4j 调整查询以返回正确的结果,neo4j,cypher,Neo4j,Cypher,我有下面的问题。在这里,我收集所有行和技能,将行作为行展开,并检查应聘者技能是否在我想要的所有技能中,我检查与该应聘者相关的所有技能是否在我想要的所有技能列表中。 我需要以某种方式更改查询,因为我希望查询仅在“知道”所有必需技能并且每项技能都具有相同或更多年的经验的情况下才返回我的候选人。 简而言之,如果一个应聘者知道所有技能,并且每个技能都有相同或更多年的经验,那么我想要这个节点,否则不需要。 有什么想法吗 WITH [ {entity_id: 7, years_of_exp

我有下面的问题。在这里,我收集所有行和技能,将行作为行展开,并检查应聘者技能是否在我想要的所有技能中,我检查与该应聘者相关的所有技能是否在我想要的所有技能列表中。 我需要以某种方式更改查询,因为我希望查询仅在“知道”所有必需技能并且每项技能都具有相同或更多年的经验的情况下才返回我的候选人。 简而言之,如果一个应聘者知道所有技能,并且每个技能都有相同或更多年的经验,那么我想要这个节点,否则不需要。 有什么想法吗

WITH  [
        {entity_id: 7, years_of_experience: 5},
        {entity_id: 23776, years_of_experience: 1 },
        {entity_id: 17477, years_of_experience: 1 }
      ]  AS rows
UNWIND rows AS row
MATCH  (s:SkillNode)
  WHERE s.entity_id = row.entity_id
WITH  collect(row) as rows, collect(s) as allSkills, s
UNWIND rows as row
MATCH (c:CandidateNode)-[r:KNOWS]->(s)
  WHERE  (r.years_of_experience>=row.years_of_experience 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 skills, rels, c;

下面不是您想要的确切查询,因为我使用的是技能名称而不是实体id,但它可以类似于您想要的

步骤:

  • 将所需技能和经验年数放在一个列表(行)中
  • 在SkillNode中搜索每个必需的技能以确保其有效
  • 根据每项技能的多年经验筛选出候选人
  • 挑选具备所需技能(行)中所有技能的候选人
  • 示例图:

    你永远是最棒的!非常感谢你的回答!我能问更多的问题吗?在
    WHERE ALL(skill in rows WHERE skill.name in[c in candidateSkills | c.name])
    这到底是什么“[c in candidateSkills | c.name]”?这正式称为列表理解,但基本上这只是转换列表元素的一种方式。对于列表中的每个元素,我们需要的是元素的名称,因此我们最终得到的是名称列表,而不是节点列表。如果我们在列表中添加WHERE子句,列表理解也可以进行过滤。@InverseFalcon非常感谢!
    WITH  [
            {name: "Java", years_of_experience: 5},
            {name: "Spring Boot", years_of_experience: 1 } 
          ]  AS rows
    UNWIND rows AS row
    MATCH  (skill:SkillNode) WHERE skill.name = row.name
    WITH  rows, row
    // Validate the skills
    MATCH (c:CandidateNode)-[r:KNOWS]->(s:SkillNode) 
        WHERE s.name  = row.name 
    // Check if the years of experience is good
    WITH c, r, s, rows, row 
        WHERE r.years_of_experience >= row.years_of_experience
    // Check that candidate has ALL skills required 
    WITH c, rows, collect(s) as candidateSkills 
        WHERE ALL(skill in rows WHERE skill.name in [c in candidateSkills|c.name]) 
    RETURN c
    
    Result:
    ╒════════════════╕
    │"Candidate"     │
    ╞════════════════╡
    │{"name":"Leo"}  │
    ├────────────────┤
    │{"name":"Manos"}│
    └────────────────┘