Neo4j 可扩展性和索引
Neo4j scalability and indexing
支持使用本地存储的图形 dbms 而不是由 neo4j(也在 neo4j 图形数据库书中)制作的关系 dbms 的一个论点是 "index-free adjacency" 是处理图形数据的最有效方法(由于到基于图的模型中 data/nodes 的 'clustering')。
根据我执行的一些基准测试,其中 3 个节点顺序连接 (A->B<-C) 并且给定 A 的 id 我正在查询 C,可扩展性显然是 O(n)在具有 1M、5M、10M 和 20M 节点的数据库上测试相同的查询时 - 这是合理的(以我有限的理解),考虑到我没有将查询限制为仅 1 个节点,因此需要检查所有节点是否匹配。但是,当我索引查询节点 属性 时,同一查询的执行时间相对恒定。
图中显示了索引前后按数据库节点大小的执行时间。橙色图是 O(N) 参考线,而蓝色图是观察到的执行时间。
基于这些结果,我试图弄清楚无索引邻接的优势在哪里。在深度(呃)链接的限制为 1 的情况下查询时,这是否有利?例如。 A->B->C->D->E 中的深度为 4,并在给定 A 的情况下查询 E。因为在这种情况下,我们知道 A 只有一个匹配项(因此无需通过所有其他项进行暴力破解)不属于该子网的节点)。
由于这高度依赖于查询,我在下面列出了一个 Cypher 查询的示例以供参考(我在其中匹配 id 为 1 的标记为节点的实体,并返回关联的节点(B 在上例)和二级链接节点(上例中的 C)):
MATCH (:entity{id:1})-[:LINK]->(result_assoc:assoc)<-[:LINK]-(result_entity:entity) RETURN result_entity, result_assoc
更新/附加信息
This source 状态:"The key message of index-free adjacency is, that the complexity to traverse the whole graph is O(n), where n is the number of nodes. In contrast, using any index will have complexity O(n log n)."。该语句解释了索引之前的 O(n) 结果。我猜索引后的 O(1) 性能与哈希列表性能相同(?)。不确定为什么使用任何其他索引的复杂性是 O(n log n),即使使用哈希列表最坏的情况也是 O(n)。
根据我的理解,无索引方面仅与相邻节点相关(这就是为什么它被称为无索引 adjacency)。你的情节证明的是,当你找到 A
时,找到 C
的额外时间可以忽略不计,是否使用索引的问题只是找到初始查询的节点A
.
在没有索引的情况下查找 A
需要 O(n),因为它必须扫描数据库中的所有节点,但是如果有索引,它实际上就像一个散列列表,并且需要 O( 1)(不知道为什么这本书也说 O(n log n))。
除此之外,对于 Neo4j 来说,找到相邻节点并不难,因为它们链接到 A
,而在 RM 中,链接并不那么明确 - 因此连接很昂贵,然后scan/filter 是必需的。因此,要真正看到优势,应该通过改变 relations/links 的深度来比较图形数据库和 RM 数据库的性能。当实体节点的邻居增加(即图形变得更密集)时,看看查询将如何执行也很有趣 - Neo4j 是否依赖图形永远不会太密集?否则,通过邻居寻找合适的问题会重复出现。
支持使用本地存储的图形 dbms 而不是由 neo4j(也在 neo4j 图形数据库书中)制作的关系 dbms 的一个论点是 "index-free adjacency" 是处理图形数据的最有效方法(由于到基于图的模型中 data/nodes 的 'clustering')。
根据我执行的一些基准测试,其中 3 个节点顺序连接 (A->B<-C) 并且给定 A 的 id 我正在查询 C,可扩展性显然是 O(n)在具有 1M、5M、10M 和 20M 节点的数据库上测试相同的查询时 - 这是合理的(以我有限的理解),考虑到我没有将查询限制为仅 1 个节点,因此需要检查所有节点是否匹配。但是,当我索引查询节点 属性 时,同一查询的执行时间相对恒定。
图中显示了索引前后按数据库节点大小的执行时间。橙色图是 O(N) 参考线,而蓝色图是观察到的执行时间。
基于这些结果,我试图弄清楚无索引邻接的优势在哪里。在深度(呃)链接的限制为 1 的情况下查询时,这是否有利?例如。 A->B->C->D->E 中的深度为 4,并在给定 A 的情况下查询 E。因为在这种情况下,我们知道 A 只有一个匹配项(因此无需通过所有其他项进行暴力破解)不属于该子网的节点)。
由于这高度依赖于查询,我在下面列出了一个 Cypher 查询的示例以供参考(我在其中匹配 id 为 1 的标记为节点的实体,并返回关联的节点(B 在上例)和二级链接节点(上例中的 C)):
MATCH (:entity{id:1})-[:LINK]->(result_assoc:assoc)<-[:LINK]-(result_entity:entity) RETURN result_entity, result_assoc
更新/附加信息
This source 状态:"The key message of index-free adjacency is, that the complexity to traverse the whole graph is O(n), where n is the number of nodes. In contrast, using any index will have complexity O(n log n)."。该语句解释了索引之前的 O(n) 结果。我猜索引后的 O(1) 性能与哈希列表性能相同(?)。不确定为什么使用任何其他索引的复杂性是 O(n log n),即使使用哈希列表最坏的情况也是 O(n)。
根据我的理解,无索引方面仅与相邻节点相关(这就是为什么它被称为无索引 adjacency)。你的情节证明的是,当你找到 A
时,找到 C
的额外时间可以忽略不计,是否使用索引的问题只是找到初始查询的节点A
.
在没有索引的情况下查找 A
需要 O(n),因为它必须扫描数据库中的所有节点,但是如果有索引,它实际上就像一个散列列表,并且需要 O( 1)(不知道为什么这本书也说 O(n log n))。
除此之外,对于 Neo4j 来说,找到相邻节点并不难,因为它们链接到 A
,而在 RM 中,链接并不那么明确 - 因此连接很昂贵,然后scan/filter 是必需的。因此,要真正看到优势,应该通过改变 relations/links 的深度来比较图形数据库和 RM 数据库的性能。当实体节点的邻居增加(即图形变得更密集)时,看看查询将如何执行也很有趣 - Neo4j 是否依赖图形永远不会太密集?否则,通过邻居寻找合适的问题会重复出现。