泰坦DB神秘新锐

时间:2014-07-15 08:43:22

标签: gremlin titan

当提交并发请求,连接到外部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()

0 个答案:

没有答案