我对使用gremlin到海王星的插入有问题。我试图插入许多节点和边,可能有数十万个节点和边,并检查是否存在。
目前,我们正在使用inject插入节点,问题是是慢。
运行explain命令后,我们发现问题是合并和步骤--运行时间的99.9%以上。
只有当每个节点和边缘不存在时,我才希望插入它,这就是为什么我要使用合并和步骤。
例如,用于插入具有inject的节点的查询:
properties_list = [{‘uid’:’1642’},{‘uid’:’1322’}…]
g.inject(properties_list).unfold().as_('node')
.sideEffect(__.V().where(P.eq('node')).by(‘uid).fold()
.coalesce(__.unfold(), __.addV(label).property(Cardinality.single,'uid','1')))对于图中的1000个节点和具有100个元素的properties_list,运行上面的查询大约需要30秒,并且随着图中节点数的增加,运行速度会变慢。
使用与上面的查询相同的环境运行一个朴素的注入,没有的合并在一起,只需不到1秒。我想听听您的建议,并知道插入许多节点和边的最佳实践是什么(检查是否存在)。
非常感谢。
发布于 2022-03-02 15:21:27
如果您有一组要检查是否存在的If,则可以通过只向查询提供一个If列表并计算预先存在的If的交集来显著加快查询速度。然后,在计算了需要更新的集合之后,您可以一次性应用它们。这将产生很大的影响。您遇到问题的原因是中期遍历V有很多工作要做。一般来说,最好使用实际的UID,而不是属性(在您的例子中是UID)。如果这不是一个选项,同样的技术将适用于基于属性的ID。这些步骤是:
inject或sideEffect将要查找的ID作为一个列表插入,并在单独的地图中有条件地应用包含更改的相应映射。<代码>g 210
下面是一个具体的例子。我使用了图表记事本,但是您可以在代码中做同样的事情:
给予:
ids = "['1','2','9998','9999']"和
data = "[['id':'1','value':'XYZ'],['id':'9998','value':'ABC'],['id':'9999','value':'DEF']]"我们可以这样做:
g.V().hasId(${ids}).id().fold().as('exist').
constant(${data}).
unfold().as('d').
where(without('exist')).by('id').by()它正确地找到不存在的:
{'id': 9998, 'value': 'ABC'}
{'id': 9999, 'value': 'DEF'}您可以使用此模式更有效地构造条件插入(我希望:-)。因此,要添加新的顶点,您可以这样做:
g.V().hasId(${ids}).id().fold().as('exist').
constant(${data}).
unfold().as('d').
where(without('exist')).by('id').by().
addV('test').
property(id,select('d').select('id')).
property('value',select('d').select('value'))
v[9998]
v[9999]顺便提一下,我们在Gremlin-mergeV和mergeE中增加了两个新的步骤,这样可以更容易地以更声明的方式完成这一任务。这些新步骤应该是TinkerPop 3.6版本的一部分。
https://stackoverflow.com/questions/71323900
复制相似问题