Neo4j中的基本查询

时间:2015-05-25 13:14:59

标签: neo4j

查询的以下两个变体产生不同的结果(第一个给出了我想要的结果)。我不知道为什么。它们看起来和我一样。有人可以帮忙吗?

MATCH (gene:Person)-[:ACTED_IN]->(mov),
(actr:Person)-[:ACTED_IN]->(mov), (robin:Person{name:"Robin Williams"})
WHERE NOT (robin)-[:ACTED_IN]->(mov)
AND gene.name = "Gene Hackman"
RETURN  gene, mov, actr;

MATCH (gene:Person)-[:ACTED_IN]->(mov),
(actr:Person)-[:ACTED_IN]->(mov), (robin:Person)
WHERE gene.name = "Gene Hackman"
AND NOT (robin{name:"Robin Williams"})-[:ACTED_IN]->(mov)
RETURN  gene, mov, actr;

1 个答案:

答案 0 :(得分:0)

此:

WHERE NOT (robin)-[:ACTED_IN]->(mov)
AND gene.name = "Gene Hackman"

意思是“罗宾没有在电影中扮演角色,而基因的名字不是'真正的哈克曼'”

此:

WHERE gene.name = "Gene Hackman"
AND NOT (robin{name:"Robin Williams"})-[:ACTED_IN]->(mov)

意思是“Gene的名字是'Gene Hackman',而Robin Williams没有在电影中扮演角色。”

看看发生了什么? Gene Hackman文件管理器正在成为WHERE NOT函数的一部分。您需要使用第二个示例或者像这样重写第一个示例:

MATCH (gene:Person { name: 'Gene Hackman' })-[:ACTED_IN]->(mov),
(actr:Person)-[:ACTED_IN]->(mov), (robin:Person{name:"Robin Williams"})
WHERE NOT (robin)-[:ACTED_IN]->(mov)
RETURN  gene, mov, actr;

我尽可能地在查询中保持WHERE语法一致。如果我使用节点内语法过滤节点或rel,我会尝试以相同的方式执行其他操作。它使事情可预测和可读。