Neo4j:索引节点 属性 或关系 属性 哪个更快?
Neo4j: which is faster, indexed node property or relationship property?
什么是 faster/better 建模方式,搜索具有索引 属性 的节点,或者具有具有大量 ChildOf 关系的单个 ROOT 节点,每个关系具有关系 属性等于索引 属性 并从 ROOT 开始搜索并遍历具有正确关系 属性 的关系?假设正在寻找的密钥是唯一的。
我认为这是思考这个问题的错误方式;您应该以对域更自然的方式对数据建模。
很难回答哪个更快,因为您没有指定索引中包含多少个有效值、节点总数等等。在任何情况下,如果您试图表达某种语义关系,例如 ChildOf
,您几乎肯定会更好地使用节点和关系。您应该考虑将一个节点的 ID 存储为另一个节点的 属性 值,这是要避免的主要反模式。
如果另一方面,属性 是说,一个人的性别,M/F,而你有 1,000,000 人,那么你最终有两个 "index nodes",每个有 500,000 个关系,这不是一个好主意。
一般来说,neo4j 被设置为快速遍历关系,所以一般来说,你最好利用关系。但是有很多例外情况取决于您域的语义和属性值的基数,因此 YMMV。
我的理解是当前版本的 Neo4j (2.2.3) 在 label.property
您希望在谓词中使用的组合。对于关系属性,索引不使用较新的索引方案。您只能对关系属性使用旧的 legacy 索引,速度不那么快。
查看关于此的注释 page。
什么是 faster/better 建模方式,搜索具有索引 属性 的节点,或者具有具有大量 ChildOf 关系的单个 ROOT 节点,每个关系具有关系 属性等于索引 属性 并从 ROOT 开始搜索并遍历具有正确关系 属性 的关系?假设正在寻找的密钥是唯一的。
我认为这是思考这个问题的错误方式;您应该以对域更自然的方式对数据建模。
很难回答哪个更快,因为您没有指定索引中包含多少个有效值、节点总数等等。在任何情况下,如果您试图表达某种语义关系,例如 ChildOf
,您几乎肯定会更好地使用节点和关系。您应该考虑将一个节点的 ID 存储为另一个节点的 属性 值,这是要避免的主要反模式。
如果另一方面,属性 是说,一个人的性别,M/F,而你有 1,000,000 人,那么你最终有两个 "index nodes",每个有 500,000 个关系,这不是一个好主意。
一般来说,neo4j 被设置为快速遍历关系,所以一般来说,你最好利用关系。但是有很多例外情况取决于您域的语义和属性值的基数,因此 YMMV。
我的理解是当前版本的 Neo4j (2.2.3) 在 label.property
您希望在谓词中使用的组合。对于关系属性,索引不使用较新的索引方案。您只能对关系属性使用旧的 legacy 索引,速度不那么快。
查看关于此的注释 page。