2016-11-14 117 views
4

我有一個圖表,有幾個指數。他們是兩個具有標籤限制的綜合指數。 (兩者在不同的屬性/標籤上完全相同)。 一個似乎工作,但另一個沒有。我已經做了以下配置文件()到一倍檢查:泰坦Db忽略指數

一個叫KeyOnNode:物業uid和標籤node

gremlin> g.V().hasLabel("node").has("uid", "xxxxxxxx").profile().cap(...) 
==>Traversal Metrics 
Step                Count Traversers  Time (ms) % Dur 
============================================================================================================= 
TitanGraphStep([~label.eq(node), uid.eq(dammit_...      1   1   2.565 96.84 
    optimization                     1.383 
    backend-query              1      0.231 
SideEffectCapStep([~metrics])           1   1   0.083  3.16 
              >TOTAL      -   -   2.648  - 

以上是完全可以接受的,並且效果很好。我假設魔術線是backend-query

另一種方式叫做NameOnSuperNode:物業name和標籤supernode

gremlin> g.V().hasLabel("supernode").has("name", "xxxxxxxx").profile().cap(...) 
==>Traversal Metrics 
Step                Count Traversers  Time (ms) % Dur 
============================================================================================================= 
TitanGraphStep([~label.eq(supernode), name.eq(n...      1   1  5763.163 100.00 
    optimization                     2.261 
    scan                       0.000 
SideEffectCapStep([~metrics])           1   1   0.073  0.00 
              >TOTAL      -   -  5763.236  - 

這裏查詢需要的時間離譜量,我們有一個scan線。我原本想,如果指數沒有通過管理系統提交,但可惜下面似乎就好了工作:

gremlin> m = graphT.openManagement(); 
==>com.thinkaurelius.titan.graphdb.database.management.ManagementSys[email protected] 
gremlin> index = m.getGraphIndex("NameOnSuperNode") 
==>NameOnSuperNode 
gremlin> index.getFieldKeys() 
==>name 
gremlin> import static com.thinkaurelius.titan.graphdb.types.TypeDefinitionCategory.* 
==>null 
gremlin> sv = m.getSchemaVertex(index) 
==>NameOnSuperNode 
gremlin> rel = sv.getRelated(INDEX_SCHEMA_CONSTRAINT, Direction.OUT) 
==>[email protected]2 
gremlin> sse = rel.iterator().next() 
==>[email protected]5 
gremlin> sse.getSchemaType() 
==>supernode 

我不能復位分貝在這一點上。任何幫助指出問題可能會是驚人的,我在這裏打牆。 這是我需要重新索引的標誌嗎?

信息:泰坦DB 1.1(TP 3.1.1)

乾杯

更新:我發現有問題的指數是不是在REGISTERED狀態:

gremlin> :> m = graphT.openManagement(); index = m.getGraphIndex("NameOnSuperNode"); pkey = index.getFieldKeys()[0]; index.getIndexStatus(pkey) 
==>INSTALLED 

我如何獲得它註冊?我試過m.updateIndex(index, SchemaAction.REGISTER_INDEX).get(); m.commit(); graphT.tx().commit();,但它似乎並沒有做任何事情

更新2:我已經試過regitering索引,以便與下面的重新索引:

gremlin> m = graphT.openManagement(); 
index = m.getGraphIndex("NameOnSuperNode") ; 
import static com.thinkaurelius.titan.graphdb.types.TypeDefinitionCategory.*; 
import com.thinkaurelius.titan.graphdb.database.management.ManagementSystem; 
m.updateIndex(index, SchemaAction.REGISTER_INDEX).get(); 
ManagementSystem.awaitGraphIndexStatus(graphT, "NameOnSuperNode").status(SchemaStatus.REGISTERED).timeout(20, java.time.temporal.ChronoUnit.MINUTES).call(); 
m.commit(); 
graphT.tx().commit() 

但這不是加工。我仍然有我的索引INSTALLED狀態,我仍然超時。我檢查過沒有公開交易。任何人有想法?僅供參考,圖形運行在一臺服務器上,具有約100K個頂點和約130k個邊。

回答

6

因此,有可以在這裏發生的幾件事情:

  1. 如果同時你描述在同一事務未創建的索引(和問題指數問題是在name之後創建的propertyKey已經定義),那麼你應該發出一個重新索引,按Titan docs

    圖索引的名稱必須是唯一的。根據 新定義的屬性鍵構建的圖索引,即在 中定義的與索引相同的管理事務的屬性鍵,立即可用 。針對使用中已經使用 的屬性鍵構建的圖索引需要執行reindex過程以確保索引 包含所有以前添加的元素。在重建索引 過程完成之前,索引將不可用。鼓勵在 初始模式中定義圖表索引的同一事務中使用 。

  2. 該指數可能超時是需要移動從REGISTEREDINSTALLED在這種情況下要使用mgmt.awaitGraphIndexStatus()過程。你甚至可以指定你願意在這裏等待的時間。

  3. 請確保您的圖表上沒有未處理的交易,否則索引狀態確實不會改變,如here所述。

  4. 這顯然不適合你,但Titan中存在一個bug(在JanusGraph中通過this PR修復),這樣如果你爲新創建的propertyKey以及之前使用的propertyKey創建索引,則索引將卡住在REGISTERED狀態

  5. 索引不會移動到REGISTERED除非羣集中的每個Titan/JanusGraph節點都確認創建索引。如果您的索引卡住了INSTALLED狀態,則系統中的其他節點有可能無法確認索引是否存在。這可能是由於集羣中的另一臺服務器出現問題,Titan/JanusGraph使用消息隊列中的回填進行交互,或者最意外地發生:虛擬實例的存在。每當您的服務器因非正常的JVM關閉進程而死亡時,即服務器因爲被卡在世界垃圾回收系統中而停止服務時,就會發生這些問題。如果您希望回填是問題所在,this class中的評論提供了有助於解決問題的可定製配置選項的深入見解。要檢查是否存在幻像節點,請使用this function,然後使用this function來終止幻像實例。

+0

謝謝!我會嘗試一些事情。你有沒有機會知道如何延長'awaitGraphIndexStatus()'的超時時間?此外,我需要進入reindex的狀態如何?這不能從'INSTALLED'完成# –

+0

第二個答案[here](http://stackoverflow.com/questions/35656531/unable-to-create-a-composite-index-stuck-at-installed)應該回答這兩個問題都適合你!祝你好運! – David

+0

我的意思是說第一個^ – David