当提交并发请求,连接到外部cassandra时会发生这种情况。代码检查边是否存在,如果是,则更新其上的属性*,否则创建新边。
打印语句非常清楚,流程在初始创建后始终进入“更新”模式,但最终仍然会创建“新的神秘”边缘**。
*注意:如果不更新edge属性,它可以正常工作,即不会创建新的边。 **由g.V('myId',1111)定义的新边缘.outE('relLabel')。count()
import java.util.Random
import com.google.common.collect.*
g = TitanFactory.open('my-titan-cassandra.properties')
def init(g,outId,inId){
if(g.getType('myId') == null)
g.makeKey("myId").dataType(java.lang.Long.class).indexed(Vertex.class).unique().make()
if(g.getType('vProp') == null)
g.makeKey("vProp").dataType(String.class).indexed(Vertex.class).make()
if(g.getType('relProp') == null)
g.makeKey("relProp").dataType(java.lang.Long.class).indexed(Edge.class).make()
Vertex v = Iterables.getOnlyElement(g.V('myId',outId),null)
if(v == null ){
g.addVertex(["myId":outId,"vProp":"prop -- 100"])
}
v = Iterables.getOnlyElement(g.V('myId',inId),null)
if(v == null){
g.addVertex(["myId":inId,"vProp":"prop -- 200"])
}
}
def addOrUpdateEdge(outId,inId,label,g){
Random r = new Random()
int rnd = r.nextInt(10)
long i = rnd % 2 == 0 ? 1 : -1
println('hello > ' + i)
Vertex v1 = Iterables.getOnlyElement(g.V('myId',outId),null)
Vertex v2 = Iterables.getOnlyElement(g.V('myId',inId),null)
Edge e = null
if(g.V('myId', outId).outE(label).as('x').inV.has('id', g.V('myId', inId).next().id).back('x').hasNext()){
e = g.V('myId', outId).outE(label).as('x').inV.has('id', g.V('myId', inId).next().id).back('x').next()
println('updating ' + i) //--> flow comes to this point
e.setProperty('relProp',i) //--> THIS CAUSES NEW EDGES
g.commit()
} else {
println("adding edge")
e = g.addEdge(null, v1, v2, "relLabel", ["relProp":i])
}
}
outId1=1111
inId1=2111
init(g,outId1,inId1)
tlist = []
g.commit()
for(i in 1..10){
tlist.add(Thread.start {
addOrUpdateEdge(1111,2111,"relLabel",g)
g.commit()
})
}
for (t in tlist){
t.join()
}
println('done')
g.commit()