我正在努力解决在Cypher中创建查询的问题。 我们以此图表为例:
MERGE(a:Person {name:'Alice', age:38, eyes:'brown'})
MERGE(c:Person {name:'Charlie', age:53, eyes:'green'})
MERGE(d:Person {name:'Daniel', age:54, eyes:'brown'})
MERGE(b:Person {name:'Bob', age:25, eyes:'blue'})
MERGE(a)-[:KNOWS]->(c)
MERGE(a)-[:KNOWS]->(b)
MERGE(c)-[:KNOWS]->(d)
MERGE(b)-[:KNOWS]->(d)
我希望只有在没有name = 'Alice'
的节点的情况下才能使用name = 'Bob'
返回节点的查询。所以,如果有鲍勃,我希望看不到任何结果。
这是我尝试过的:
1)使用exists()
MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NOT EXISTS ((n {name: 'Bob'})-[*1..3]->(b))
RETURN p
但它返回所有节点和关系。
2)没有()
MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NONE (x IN nodes(p) WHERE x.name = 'Bob')
RETURN p
这返回了所有节点,没有Bob ......
3)with any()
MATCH p =(n)-[*1..3]->(b)
WHERE n.name = 'Alice' AND NOT ANY (x IN nodes(p) WHERE x.name = 'Bob')
RETURN p
但这给了我与上面相同的结果。
如果Bob不在场,我的想法是如何返回Alice。 我对查询的期望是当我删除Bob时返回Alice,但是当这样的节点存在时 - 没有。
感谢任何帮助:)
谢谢!
答案 0 :(得分:1)
您应该尝试此查询:
MATCH (n:Person {name:'Alice'})
WHERE NOT (n)-[:KNOWS*..3]-(:Person {name:'Bob'})
RETURN n