我试着简化我的问题。如果Neo4jDB中的所有节点都具有相同的标签Science
,则MATCH n WHERE n.ID="UUID-0001" RETURN n
和MATCH (n:Science) WHERE n.ID="UUID-0001" RETURN n
之间的区别是什么。为什么表现不一样?
我的Neo4j数据库包含大约70000个节点和100个关系。
节点有两种类型:Paper
和Author
,它们都有一个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),表示每个节点有两个标签。
答案 0 :(得分:4)
因为每个标签Neo4j都会自动创建一个额外的索引。 Cypher语言可以被广泛地认为是管道+过滤,因此匹配n WHere ...将首先获得每个节点,然后过滤where部分。匹配(n:科学)其中......将使每个节点都有标签科学(使用索引),然后尝试匹配where。根据您的查询性能,我们可以看到大约1/5的节点都标记为科学,所以查询在他的第五次运行时,因为它进行了五分之一的比较。
答案 1 :(得分:0)
尽管我得到了@ phil_20686和@Michael Hunger的建议,但我认为这些答案并没有解决我的问题。
我认为使用标签时会有一些技巧。如果它们是Neo4j DB中的1万个节点,并且这些节点的类型是相同的。向这些节点添加标签时,查询的效果会更好。
我希望这篇文章可以帮助一些人,如果你找到原因,可以给我一些反馈。感谢。