Cypher无法匹配另一个集合中没有的地方

时间:2017-01-15 11:27:18

标签: neo4j cypher

我想从一个不在第二个集合中的集合中返回项目。我有一个我在下面尝试过的例子,但它只返回第一个集合中的所有项目。

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

2 个答案:

答案 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