我一直在研究Tinkerpop堆棧很長一段時間。我想我對它可以做什麼以及它可以很好地工作的數據庫有個很好的想法。我現在正在考慮一些不同的數據庫,但還沒有確定。所以我決定將我的代碼純粹寫入接口,並且現在不考慮的任何實現。在我看到的數據庫中,它們實現TransactionalGraph
和KeyIndexableGraph
。我認爲這足夠滿足我需要的,但我只有一個問題。Tinkerpop Blueprints頂點查詢
我有不同的'類'的頂點。使用藍圖,我認爲最好通過在包含類名的每個頂點中包含一個字段來表示。這樣做,我可以做類似graph.getVertices("classname", "User")
的東西,它會給我所有的用戶頂點。由於getVertices
函數指定一個實現應該使用索引,我保證會得到一個快速查找(如果我索引該字段)。
但讓我們說,我想基於兩個屬性檢索頂點。頂點必須有className=Users
和username=admin
。尋找單個頂點的最佳方法是什麼?是否有可能索引這兩個屬性,即使並非所有的頂點都有username
字段?我想要的數據庫是OrientDB,Neo4j和Titan,但我還沒確定。我目前也計劃使用Gremlin,如果有幫助的話。
那麼,正如你所說,查詢有些實現特定(不幸)。我希望能夠隨時切換數據庫,所以我只寫了我自己的查詢包裝器。謝謝你的幫助。 – GJK 2013-04-22 02:08:39
是的,這很不幸,但這是大多數這些系統構建的方式,有些可能沒有執行特定類型的查詢的能力,因此他們將其留在了實現特定的位置。 – Nicholas 2013-04-22 02:12:09
說'graph.getVertices()'做線性掃描是不正確的。如果圖形實現KeyIndexableGraph(以及所有提到的三個圖),並且指定的密鑰是作爲密鑰索引創建的密鑰,則使用索引並避免線性掃描。 https://github.com/tinkerpop/blueprints/wiki/Graph-Indices#keyindexablegraph-and-fast-lookup-of-elements-by-keyvalue-pairs – 2013-04-22 11:02:08