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

Did I just increase the db hit count (x2) by adding a node label into my cypher query?

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

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

根据 Mark Needham 和 Petra Selmer(在 Graph Connect Europe 2016 中表现出色 talk),在查询中添加标签 Product 将大大提高性能,因为我们限制了搜索 space 的查询。完全有道理。奇怪的是,一开始我~~不小心~~省略了 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 的新手,我这里可能遗漏了一些非常明显的东西。添加节点标签时可能导致数据库命中计数增加的原因是什么?

简短的回答是肯定的,当您在查询中有一个标签时,就会有数据库命中要在标签上过滤,所以您的眼睛不会骗您。

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

有些时候你可以不加标签,有些时候你真的需要加标签。

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

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

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