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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (47)

我正在设置我的数据库,有时我需要使用ID。首先,我将ID作为属性添加到我感兴趣的节点,但意识到我也可以使用neo4j的内部id“”。然后我偶然发现了CREATE INDEX ON:标签(某物)并且想知道这会做什么?我以为一个索引和那个会是同一个东西?

这可能是一个愚蠢的问题,但由于我是数据库的初学者,我可能会遗漏一些这些概念。

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

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

提前致谢。

提问于
用户回答回答于

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

至于索引和id,这里是文档的索引部分,但它的要点是这与Neo4j如何查找起始节点有关。Neo4j仅使用索引来查找这些起始节点(尽管在我们进行索引查找时为3.5,如果在索引属性上有ORDER BY,它将使用索引来增强排序的性能)。

以下是Neo4j将尝试使用的内容,具体取决于可用性,从最快到最慢:

  1. 按内部ID查找 - 这总是很快,但我们不建议在查询上下文之外保留这些内部ID。原因是当删除图元素时,它们的id有资格重用。如果你保留Neo4j之外的内部id,并在以后执行查找,那么你可能已经删除了任何你想要引用它的东西,并且可能指向任何东西,或者可能指向一个完全不同的新节点数据。
  2. 按索引查找 - 这是您希望使用CREATE INDEX ON(或添加唯一约束,如果这对您的模型有意义)。当您使用与索引关联的标签和属性(或属性)使用MATCH或MERGE时,这是对所需节点的快速直接查找。
  3. 通过标签扫描查找 - 如果执行模式中存在标签的MATCH,但无法使用索引(标签/属性组合没有索引,或者只有标签但没有属性),则a将执行标签扫描,并且将匹配给定标签的每个节点并进行过滤。随着添加具有这些标签的更多节点,这变得更加昂贵。
  4. 所有节点都扫描 - 如果您没有在MATCH模式中提供任何标签,则将扫描和过滤数据库中的每个节点。随着数据库的增长,这非常昂贵。

您可以EXPLAIN或PROFILE查询以查看其查询计划,该计划将显示使用哪种查找方法来查找起始节点,以及执行查询的其余操作。

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

扫码关注云+社区

领取腾讯云代金券