neo4j中的索引和内部ID有什么区别?

时间:2019-06-04 21:57:09

标签: python neo4j

我正在设置数据库,有时我需要使用ID。最初,我向感兴趣的节点添加了ID作为属性,但意识到我也可以只使用neo4j的内部ID“”。然后我偶然发现了CREATE INDEX ON:label(something),并想知道这到底会做什么?我以为索引和那是同一回事?

这可能是一个愚蠢的问题,但是由于我是数据库的初学者,因此我可能会缺少其中一些概念。

此外,我一直在阅读要使用哪种数据库(mySQL,MongoDB或neo4j)并决定使用neo4j,因为我的数据几乎都遵循图结构。 (将用于建立代谢模型:连接基因->蛋白质->反应->化合物)

在SQL中,语法似乎太复杂了,因为我不得不绕过几个表来进行简单的连接,而neo4j很容易完成... 据我了解,MongoDb独立存储数据,并且由于我的数据已连接,因此它似乎并不适合数据结构。 但是,由于我对这一主题的知识有限,也许我没有做出正确的选择?

谢谢。

1 个答案:

答案 0 :(得分:2)

图形数据库非常适合这样的连接数据,比关系数据库或文档存储更适合存储和查询。

关于索引和ID,这里是文档的index section,但要点在于,这与Neo4j如何查找起始节点有关。 Neo4j仅使用索引来查找这些起始节点(尽管在3.5中像这样进行索引查找时,如果在indexed属性上具有ORDER BY,它将使用索引来增强排序的性能。

根据可用性,从最快到最慢,这是Neo4j尝试使用的东西:

  1. 按内部ID查找-总是很快速,但是我们不建议在查询上下文之外保留这些内部ID。这样做的原因是,当删除图元素时,其ID可以重新使用。如果您将内部ID保留在Neo4j的外部,然后在以后对它们进行查找,则很可能删除了您希望引用的所有内容,并且可能什么也没有,或者可能指向完全不同的新节点。数据。

  2. 按索引查找-您希望在此处使用CREATE INDEX ON(或添加唯一约束,如果这对您的模型有意义)。当您使用与索引相关联的标签和属性(或多个属性)来使用MATCH或MERGE时,这是对所需节点的快速直接查找。

  3. 通过标签扫描进行查找-如果在模式中存在标签的情况下进行了匹配,但是没有使用索引的方式(或者标签/属性组合不存在索引,或者仅标签存在但无属性),则将执行标签扫描,并且将匹配并过滤给定标签的每个节点。随着添加带有这些标签的更多节点,这变得更加昂贵。

  4. 所有节点都进行扫描-如果您未在MATCH模式中提供任何标签,则将扫描和过滤数据库中的每个节点。随着数据库的增长,这非常昂贵。

您可以解释或配置查询以查看其查询计划,该计划将向您显示用于查找起始节点的查找方式以及执行查询的其余操作。

一旦找到一个或多个起始节点,Neo4j就会使用关系遍历和过滤来展开并找到与所需模式匹配的所有路径。