Neo4j 这是表达”的最佳方式吗;“遍历所有节点”;用密码查询?

Neo4j 这是表达”的最佳方式吗;“遍历所有节点”;用密码查询?,neo4j,cypher,Neo4j,Cypher,我有一个相当大的社交图,我在其中执行如下全局查询: match (n:User)-[r:LIKES]->(k:User) where not (k:User)-[]->(n:User) return count(r); 它们需要大量的时间和记忆,所以我很好奇它们是否以最佳方式表达。我感觉,当我执行这样的查询时,Cypher首先匹配符合表达式的所有内容(这需要大量内存),然后开始计数。我希望检查每个节点,检查模式,并在必要时更新计数器。这样,这样的查询就不需要很多内存。那么,这种查询

我有一个相当大的社交图,我在其中执行如下全局查询:

match (n:User)-[r:LIKES]->(k:User)
where not (k:User)-[]->(n:User)
return count(r);

它们需要大量的时间和记忆,所以我很好奇它们是否以最佳方式表达。我感觉,当我执行这样的查询时,Cypher首先匹配符合表达式的所有内容(这需要大量内存),然后开始计数。我希望检查每个节点,检查模式,并在必要时更新计数器。这样,这样的查询就不需要很多内存。那么,这种查询实际上是如何执行的呢?如果它不是最优的,有没有办法使它更好(用密码)?

如果您在编写查询时使用它,您可能无法获得您认为的结果。在节点“变量”上添加标签会导致它们被视为新的(部分)模式,而不是绑定节点。如果您使用

MATCH (n:User)-[r:LIKES]->(k:User)
WHERE NOT (n)<--(k)
RETURN count(r)

看看有没有什么不同。我认为不会,但我可能错了。

看来你是对的。它更快:1692689毫秒比951958毫秒。然而,我仍然不确定这是否是最理想的方式。
WHERE NOT (k)-->(n)