我正在使用JanusGraph文档所述的multi-threaded transactions。我的每个线程都有助于构建目录树。在为特定目录插入新顶点之前,每个线程首先检查同一查询中是否已存在该顶点。如果找不到现有顶点,则仅用.orElseGet
插入顶点。
Vertex vertex = graph.traversal().V()
.hasLabel(VertexLabels.DIRECTORY)
.has(PropertyKeys.PATH, directory.path())
.tryNext()
.orElseGet(() -> {
return graph.addVertex(
T.label, VertexLabels.DIRECTORY,
PropertyKeys.PATH, directory.path());
});
从技术上讲,这假定所有线程在同一事务范围内运行,则应防止重复。但是,我确实遇到重复。该文档似乎没有提供有关此问题的任何答案。您能否确认多线程事务是否在同一范围内运行?
答案 0 :(得分:2)
多线程事务在相同的范围内运行,但是我想如果您没有在PropertyKeys.PATH
上配置unique constraint,线程仍然有可能竞争。这样做确实意味着将启用locking,这可能会降低您的摄取速度,但会确保唯一性。
请注意,请避免使用Graph API(graph.addVertex()
)并坚持使用纯Gremlin-here描述了“获取或创建”模式。