【发布时间】:2020-06-09 05:19:51
【问题描述】:
上下文:
我确实有一个包含大约 2000 个顶点和 6000 条边的图,随着时间的推移,它可能会增长到 10000 个顶点和 100000 条边。目前我正在使用以下遍历查询更新新顶点:
更新顶点和边
queryVertex = "g.V().has(label, name, foo).fold().coalesce(
unfold(), addV(label).property(name, foo).property(model, 2)
).property(model, 2)"
这里的目的是查找名为 foo 的顶点,如果找到则更新其model 属性,否则创建一个新顶点并设置model 属性。这会发出两次:一次用于源顶点,然后用于目标顶点。
一旦创建了两个相关的顶点,就会发出另一个查询来创建它们之间的边:
queryEdge = "g.V('id_of_source_vertex').coalesce(
outE(edge_label).filter(inV().hasId('id_of_target_vertex')),
addE(edge_label).to(V('id_of_target_vertex'))
).property(model, 2)"
这里,如果两个顶点之间有边,则更新边上的model属性,否则创建它们之间的边。
执行此操作的伪代码如下:
for each edge in the list of new edges:
//upsert source and target vertices:
execute queryVertex for edge.source
execute queryVertex for edge.target
// upsert edge:
execute queryEdge
这行得通,但效率极低;例如,对于提到的图形大小,它需要几分钟才能完成,并且在一些应用内并发的情况下,它只减少了几分钟的时间。当然,对于如此小的图形大小,必须有一种更有效的方法。
问题
* 我怎样才能使这些 upserts 更快?
【问题讨论】:
标签: graph gremlin tinkerpop tinkerpop3 amazon-neptune