如何检查节点是否全局存在并在Cypher中设置条件?

时间:2018-04-25 13:07:58

标签: neo4j cypher

我正在努力解决在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,但是当这样的节点存在时 - 没有。

感谢任何帮助:)

谢谢!

1 个答案:

答案 0 :(得分:1)

您应该尝试此查询:

MATCH (n:Person {name:'Alice'})
WHERE NOT (n)-[:KNOWS*..3]-(:Person {name:'Bob'})
RETURN n