我是否只是通过在密码查询中添加节点标签来增加数据库命中计数 (x2)?



所以我正在使用典型的"带标签的产品"数据模型,其中Product节点具有id属性,Tag节点具有name属性。令我惊讶的是,当我包含Product标签时,我的查询具有更多的数据库命中。

我正在分析我对产品之间的匹配和各种长度的标签列表的查询。

根据Mark Needham和Petra Selmer(Graph Connect Europe 2016的精彩演讲)的说法,在查询中添加标签Product将大大提高性能,因为我们限制了查询的搜索空间。完全有道理。奇怪的是,一开始我有~~不小心~~省略了Product标签。当我添加到查询中时,数据库命中计数几乎翻了一番,从 5803 增加到 10316!

这是我使用的查询:

PROFILE MATCH (product:Product)-[:TAGGED]->(tag:Tag)
WHERE tag.name IN ["tag_1","tag_2",..."tag_N"]
WITH product, COLLECT (tag.name) AS tags_list
RETURN product.id, tags_list;

由于我现在不敢相信自己的眼睛,在这里我分享PROFILE声明中的计划:

带节点标签

https://drive.google.com/file/d/1dGmF_2zfKdGBtThm45MUUOkLSLCEHTYU/view?usp=sharing

不带节点标签

https://drive.google.com/file/d/1efZWK6gXzNB0tjcKyhGIRFo22bDV8WjP/view?usp=sharing

我尝试在最后删除COLLECT操作,但没有标签Product查询的数据库命中率仍然较少,9325 对 13837。恐怕我对 Neo4j 真的很陌生,我可能会在这里错过一些非常明显的东西。添加节点标签时,什么可能导致数据库命中计数提高?

简短的回答是肯定的,当您的查询中有标签时,会有数据库命中来过滤标签,因此您的眼睛不会欺骗您。

也就是说,并非所有的数据库命中都是平等的。它们是数据库工作的抽象单元,标签过滤相当轻量级。

有时您可以关闭标签,有时您确实需要保留标签。

如果您的模型使得只有:P产品节点可以像这样标记,那么您可以省略标签,因为这是多余的。但是,如果有其他类型的节点可以标记,而:P产品只是其中之一,那么您肯定需要其中的:P产品标签以确保正确性。

这同样适用于具有较长路径的查询,您可能需要在此过程中筛选节点标签,这应该确保您最大限度地减少查询中其余扩展所需的工作,因为您只考虑具有正确标签的相关路径。

此外,对于模式中的某些节点,您可能在其上具有属性,并且如果标签/属性组合上存在索引,则存在标签允许计划器考虑使用索引查找。

最新更新