rop*_*der 2 graph-databases arangodb
不太复杂:我想计算每个文档的边缘并将数字保存在文档中。我提出了两个有效的查询;不幸的是,因为我有数百万条边,所以两者都非常慢。是否有一种更快的方法来使用存储边数的属性来更新文档?(只是某个时间点的计数)
功能正常但速度缓慢的 AQL 查询:
FOR doc IN Documents
LET inEdgesCount = LENGTH(GRAPH_NEIGHBORS('edgeGraph', doc,{direction: 'inbound', maxDepth:1})
LET outEdgesCount = LENGTH(GRAPH_NEIGHBORS('edgeGraph', doc,{direction: 'outbound', maxDepth:1})
UPDATE doc WITH {inEdgesCount: inEdgesCount, outEdgesCount: outEdgesCount} In Documents
Run Code Online (Sandbox Code Playgroud)
或者:
FOR e IN Edges
COLLECT docId = e._to WITH COUNT INTO counter
UPDATE SPLIT(docId,'/')[1] WITH {inEdgeCount: counter}
Run Code Online (Sandbox Code Playgroud)
(然后对出站边缘重复)
顺便说一句,有什么方法可以查看查询速度(例如每秒执行 FOR 的次数)或完成百分比吗?我一直试图通过使用有限的查询来判断速度,但所需的时间似乎并不是线性扩展的。
使用 ArangoDB 2.8,您可以使用图形模式匹配遍历来执行此操作,并获得更好的性能:
FOR doc IN documents
LET inEdgesCount = LENGTH(FOR v IN 1..1 INBOUND doc GRAPH 'edgeGraph' RETURN 1)
LET outEdgesCount = LENGTH(FOR v IN 1..1 OUTBOUND doc GRAPH 'edgeGraph' RETURN 1)
UPDATE doc WITH
{inEdgesCount: inEdgesCount, outEdgesCount: outEdgesCount} In Documents
Run Code Online (Sandbox Code Playgroud)
目前 ArangoDB 无法监控长时间运行任务的进度。在 ArangoDB 3.0 中,我们将引入一个新的监控框架,可以更好地检查服务器中实际发生的情况。然而,在 3.0 中,它将无法收集实时统计数据;今年晚些时候我们可能会在 3.x 道路上看到这一点。对于创建索引等简单任务来说,判断完成百分比可能是可能的,但在查询中,判断完成百分比将是迄今为止读/写的文档数量。
我们做了类似的查询来验证图是否遵循幂律