【问题标题】:Why it is not recommended to index relationships in a graph database为什么不建议在图数据库中索引关系
【发布时间】:2019-06-11 03:51:47
【问题描述】:

在 Aleksa Vukotic 和 Nicki Watt 所著的《Neo4j in Action》一书中,作者说:

根据我们的经验,关系索引作为好的解决方案不太常见。我们并不是说关系索引是不好的做法,但是如果您发现自己添加了很多关系索引,那么值得一问为什么。

听起来作者不建议在图数据库中索引关系,但此后没有给出解释。有谁知道为什么?

【问题讨论】:

  • 通常“根据我们的经验......”可以替代“我们不知道为什么,但是......”。

标签: neo4j graph-theory


【解决方案1】:

我已投票支持将这个问题迁移到 SO,并在希望它真正迁移的同时回答它。我使用 Neo4j 几年了。尽管从那以后它发生了很大变化,但我相信作为图形数据库的原则不会有太大变化。在我看来,如果您需要大量索引来快速查询节点之间的关系,您可以以其他方式设计数据模型,使其更多地关注图形节点(例如,关系是您的节点,和节点是你的关系,如折线图);因为查询机制(例如 Cypher 查询)通常针对节点进行了优化。

【讨论】:

    【解决方案2】:

    首先,了解索引在 Neo4j 中的作用很重要,因为索引用于在图中找到起点,然后使用关系遍历和过滤来执行剩余的模式匹配并完成查询.

    因此,建议大致相同:“我们不建议在图表中使用关系作为起点”,而且我们发现这一点往往是正确的。

    通常当您需要进行索引查找时,您会将某些“事物”作为您的起点,而图中的重要事物通常由节点表示。如果我们问“哪些员工与这家特定公司有联系”,我们感兴趣的是通过找到该特定公司并扩展来快速开始,而不是在图表中找到所有 :EMPLOYED_BY 关系并按关联公司过滤,这将花费更多的时间。

    我们经常发现那些遇到这种限制并且无论如何都需要这种快速查找关系的人可能需要重新考虑他们的模型。通常,当需要查找关系作为图中的起始位置时,这表明关系表示的事物足够重要,以至于它确实应该是图中的一个节点(与之前连接的节点有自己的关系) ),所以这变成了一种“建模气味”,推动了模型的重构更改。通常这种变化在之后感觉更自然,并且为事物提供了更多的能力作为节点,当它被建模为关系时不可用(例如,应用多个标签的能力,或连接它的能力通过与更多节点的关系,而不仅仅是原来的两个)。

    总而言之,在某些情况下,关系确实只需要成为关系(出于业务原因,或者因为它确实是最实用的建模方式,以便将其保留为关系),并使用这些关系作为图中的起点是有意义的。

    随着 Neo4j 3.5 中引入的fulltext schema indexes,我们添加了按关系类型和属性(或属性)添加关系索引的功能。因此,如果需要,在您排除模型重构之后,该功能就在那里。

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 2014-08-27
      • 2021-12-01
      • 2019-04-15
      • 2015-08-31
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多