2015-10-30 82 views
0

其實我使用這個API標準操作(讀取,刪除,查找,保存) http://orientdb.com/docs/last/Graph-Database-Tinkerpop.html性能比較使用orientdb圖形API和SQL查詢

我注意到,這個方法刪除的表現都非常糟糕

object Odb { 
    val factory = new OrientGraphFactory("remote:localhost:2424/recommendation-system","root","root").setupPool(1,10) 

    def clearDb = { 
    val graph = factory.getNoTx 
    val vertices = graph.getVertices().asScala.map(v => v.remove()) 
    } 
} 

object TagsOdb extends TagsDao { 
    override def count: Future[Long] = Future { 
    val graph = Odb.factory.getNoTx 
    val count = graph.countVertices("Tags") 
    count 
    } 

    override def update(newTag: Tag, oldTag: Tag): Future[Boolean] = Future { synchronized { 
    val graph = Odb.factory.getTx 
    val tagVertices = graph.getVertices("Tags.tag",oldTag.flatten).asScala 
    if(tagVertices.isEmpty) throw new Exception("Tag not found: "+oldTag.id) 
    tagVertices.head.setProperty("tag",newTag.flatten) 
    graph.commit() 
    true 
    }} 


    override def all: Future[List[Tag]] = Future { 
    val graph = Odb.factory.getNoTx 
    val tagVertices = graph.getVerticesOfClass("Tags").asScala 
    val tagList = tagVertices.map(v => Tag(v.getProperty("tag"),None)).toList 
    tagList 
    } 

    override def remove(e: Tag): Future[Boolean] = Future { synchronized { 
    val graph = Odb.factory.getTx 
    val tagVertices = graph.getVertices("Tags.tag",e.flatten).asScala 
    if(tagVertices.isEmpty) throw new Exception("Tag not found: "+e.flatten) 
    tagVertices.head.remove() 
    graph.commit() 
    true 
    }} 

    override def save(e: Tag, upsert: Boolean = false): Future[Boolean] = Future { synchronized { 
    val graph = Odb.factory.getTx 
    val v = graph.getVertices("Tags.tag",e.flatten).asScala 
    if(v.nonEmpty) { 
     if (upsert) 
     v.head.setProperty("tag", e.flatten) 
     else 
     throw new Exception("Element already in database") 
    } else { 
     val tagVertex = graph.addVertex("Tags", null) 
     tagVertex.setProperty("tag", e.flatten) 
    } 
    graph.commit() 
    true 
    }} 

    override def find(query: String): Future[List[Tag]] = Future { 
    val graph = Odb.factory.getNoTx 
    val res: OrientDynaElementIterable = graph.command(new OCommandSQL(query)).execute() 
    val ridTags: Iterable[Vertex] = res.asScala.asInstanceOf[Iterable[Vertex]] 
    def getTag(rid: AnyRef): Tag = { 
     val tagVertex = graph.getVertex(rid) 
     Tag(tagVertex.getProperty("tag"),None) 
    } 
    ridTags.map(r => getTag(r)).toList 
    } 
} 

有什麼方法可以獲得更好的性能? 我應該使用SQL查詢?

回答

1

由於您通過遠程接口連接,所以foreach刪除你有一個RPC。嘗試在服務器上執行DELETE VERTEX。

+0

是的,它工作正常。併爲多個調用保存方法? –

+0

你可以將多個移除/保存在一個tx中嗎? – Lvca