如何确保仅将一项添加到janusgraph

时间:2018-12-14 16:28:23

标签: scala janusgraph

有没有一种方法可以确保在janusgraph中使用给定的一组属性创建任何顶点只会导致创建一个这样的顶点?

现在,我要做的是遍历图,并确保找到的具有特定属性的顶点数仅为一个。例如:

val g = graph.traversal
val vertices = g.V().has("type", givenType).has("name", givenName).toList
if (vertices.size > 1) { 
  // the vertex is not unique, cannot add vertex
}

1 个答案:

答案 0 :(得分:2)

这可以通过称为{em> get或create 遍历来完成,该遍历在TinkerPop's Element Existence recipe和《实用Gremlin》书的Using coalesce to only add a vertex if it does not exist部分中进行了描述。

对于您的示例,遍历如下所示:

console.table({var1, var2, var3, ... });

但是请注意,这是否取决于原子操作取决于图形提供程序。在JanusGraph的情况下,存在检查和条件顶点加法是通过两个不同的操作执行的,当两个线程同时执行此遍历时,这可能导致竞争状态,在这种情况下,您仍然可以得到两个顶点属性。因此,您目前需要确保两个线程无法并行执行相同的属性的遍历,例如,在应用程序中使用锁。

我刚刚发表了一篇有关该主题的博客文章:How to Avoid Doppelgängers in a Graph Database,如果您想获得有关该主题的更多信息。它还描述了分布式锁定作为对分布式系统实施锁的一种方式,并讨论了可能的改进,以便将来更好地支持JanusGraph中的upsert。