我想从一个不在第二个集合中的集合中返回项目。我有一个我在下面尝试过的例子,但它只返回第一个集合中的所有项目。
match(e1:Skill) where e1.SkillName = 'skill1' or e1.SkillName = 'skill2'
match(e2:Skill) where e2.SkillName = 'skill2' or e2.SkillName = 'skill3'
match(e1) where
not e1.SkillName = e2.SkillName
return e1
答案 0 :(得分:2)
我认为您希望从一个查询中收集结果,并使用基于集合成员资格的谓词来查找您正在寻找的结果。
match(e2:Skill)
where e2.SkillName = 'skill2' or e2.SkillName = 'skill3'
with collect(e2) as excluded
match(e1:Skill)
where (e1.SkillName = 'skill1' or e1.SkillName = 'skill2')
and not e1 in excluded
return e1
答案 1 :(得分:0)
请勿再次调用match(e1)
,因为这会定义新的e1
变量。
相反,只需在匹配where
后添加e2
子句:
match(e1:Skill) where e1.SkillName = 'skill1' or e1.SkillName = 'skill2'
match(e2:Skill) where e2.SkillName = 'skill2' or e2.SkillName = 'skill3'
where not e1.SkillName = e2.SkillName
return e1
您还可以使用单个match
和单个where
子句以及使用不等式运算符<>
来简化查询:
match (e1:Skill), (e2:Skill)
where e1.SkillName = 'skill1' or e1.SkillName = 'skill2'
and e2.SkillName = 'skill2' or e2.SkillName = 'skill3'
and e1.SkillName <> e2.SkillName
return e1
更新:如果您正在寻找具有唯一SkillName
的节点,那么对于每个节点,您可以计算具有相同SkillName
的所有节点,并确保在那里只是一个人。
match (e1:Skill)
where e1.SkillName = 'skill1' or e1.SkillName = 'skill2'
match (e2:Skill {SkillName: e1.SkillName})
with e1, count(e2) AS count
where count = 1
return e1