为什么不建议在图数据库中索引关系

Why it is not recommended to index relationships in a graph database

在 Aleksa Vukotic 和 Nicki Watt 的书 Neo4j in Action 中,作者说:

In our experience, it is less common for relationship indexes to be good solutions. We are not saying that relationship indexing is poor practice, but if you find yourself adding lots of relationship indexes, it is worth asking why.

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

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

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

因此,建议与以下内容大致相同:"we do not recommend using relationships as starting points in the graph",而且我们发现这往往是正确的。

通常当您需要进行索引查找时,您会在脑海中将某些 "things" 作为起点,并且图形中的重要内容通常由节点表示。如果我们要问 "what employees are connected to this particular company",我们感兴趣的是通过查找特定公司并向外扩展来快速开始,而不是查找图表中的所有 :EMPLOYED_BY 关系并按关联公司进行过滤,这需要更多的时间。

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

综上所述,在某些情况下,关系确实只需要成为关系(无论是出于商业原因,还是因为它确实最实用 modeling-wise 将其保持为关系),并使用这些关系作为图中的起点是有意义的。

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