为什么节点的标签会在Neo4j中显着影响查询性能?

时间:2014-12-09 10:31:02

标签: neo4j

我试着简化我的问题。如果Neo4jDB中的所有节点都具有相同的标签Science,则MATCH n WHERE n.ID="UUID-0001" RETURN nMATCH (n:Science) WHERE n.ID="UUID-0001" RETURN n之间的区别是什么。为什么表现不一样?

我的Neo4j数据库包含大约70000个节点和100个关系。

节点有两种类型:PaperAuthor,它们都有一个ID字段。

我使用相应的标签创建了每个节点,并且还使用ID作为索引。

但是,由于我的一个功能需要按ID查询节点而不考虑标签。查询就像:MATCH n WHERE n.ID="UUID-0001" RETURN n。查询时间约为4000~5000 ms

但是在为每个节点添加Science并使用MATCH (n:Science) WHERE n.ID="UUID-0001" RETURN n之后。查询时间约为1000~1100 ms。有谁知道这两种情况之间的区别?

PS。 Count(n:Science)= Count(n:Paper)+ Count(n:Author),表示每个节点有两个标签。

2 个答案:

答案 0 :(得分:4)

因为每个标签Neo4j都会自动创建一个额外的索引。 Cypher语言可以被广泛地认为是管道+过滤,因此匹配n WHere ...将首先获得每个节点,然后过滤where部分。匹配(n:科学)其中......将使每个节点都有标签科学(使用索引),然后尝试匹配where。根据您的查询性能,我们可以看到大约1/5的节点都标记为科学,所以查询在他的第五次运行时,因为它进行了五分之一的比较。

答案 1 :(得分:0)

尽管我得到了@ phil_20686和@Michael Hunger的建议,但我认为这些答案并没有解决我的问题。

我认为使用标签时会有一些技巧。如果它们是Neo4j DB中的1万个节点,并且这些节点的类型是相同的。向这些节点添加标签时,查询的效果会更好。

我希望这篇文章可以帮助一些人,如果你找到原因,可以给我一些反馈。感谢。