我有一个非常大的社交图,我在其中执行像这样的全局查询:
match (n:User)-[r:LIKES]->(k:User)
where not (k:User)-[]->(n:User)
return count(r);
他们花了很多时间和记忆,所以我很好奇他们是否以最佳方式表达。我坚持认为,当我执行这样的查询时,Cypher首先匹配所有符合表达式的东西(并且占用大量内存)然后开始计算事物。我宁愿通过每个节点,检查模式并在必要时更新计数器。这样的查询不需要大量内存。那么实际上这样的查询是如何执行的呢?如果它不是最佳的,有没有办法让它变得更好(在Cypher中)?
答案 0 :(得分:0)
如果您按照自己的意思使用了查询,那么您可能无法获得自己的想法。将标签放在节点"变量"可以使它们被视为新的(部分)模式而不是绑定节点。如果您使用
,您的查询会更快吗?MATCH (n:User)-[r:LIKES]->(k:User)
WHERE NOT (n)<--(k)
RETURN count(r)
以下是如何运作的(不考虑内部优化,我不会开始理解)。
对于每个用户节点,遵循每个传出的LIKES关系。如果LIKES关系的另一端是User节点,则两个节点和关系绑定到名称n,k和r并传递给WHERE子句。然后测试绑定的k节点上的每个传出关系以查看它是否连接到绑定的n节点。如果未找到此类关系,则认为该匹配成功。 RETURN子句中的count()函数计算从匹配中传递的结果关系集合。
如果你有一个密集连接的图,特别是如果LIKES关系以外的节点之间还有很多其他关系,这可能是一个非常广泛的搜索。
作为进一步的实验,您可以尝试将WHERE子句更改为
WHERE NOT (k)-->(n)
看看它是否有任何区别。我不这么认为,但我错了。