2016-11-14 3 views
4

私はいくつかのインデックスを持つグラフを持っています。それらはラベルの拘束を持つ2つの複合インデックスです。 (どちらもまったく同じプロパティ/ラベルで全く同じです)。 間違いなく動作するようですが、もう一方は動作しません。プロパティuidnodeにラベルを付ける:タイタンDbはインデックスを無視する

一つはKeyOnNodeと呼ばれている:上記完全に許容され、うまく機能

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.t[email protected]73c1c105 
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をリセットすることはできません:インデックスは管理システムを通じてコミットされなかったが、次はそう悲しいかなうまく動作する場合、私はもともと疑問に思いました。どのような問題が起こっているのかを突き止める助けがあれば、私はここに壁を打っています。 これは再インデックスする必要がある兆候ですか?

INFO:タイタンDB 1.1(TP 3.1.1)

乾杯

UPDATE:

gremlin> :> m = graphT.openManagement(); index = m.getGraphIndex("NameOnSuperNode"); pkey = index.getFieldKeys()[0]; index.getIndexStatus(pkey) 
==>INSTALLED 
:私は、問題のインデックスがREGISTERED状態ではないことを発見した

どうすれば登録できますか?私はm.updateIndex(index, SchemaAction.REGISTER_INDEX).get(); m.commit(); graphT.tx().commit();を試みたが、何に

UPDATE 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ステータスの私のインデックスを持っており、私はまだタイムアウトを得ています。オープンな取引がないことを確認しました。誰でもアイデアはありますか? FYIグラフは単一のサーバー上で実行されており、〜100Kの頂点と〜130kのエッジを持っています。

答えて

6

ので、ここで起こってすることができますいくつかあります:あなたが記述これらの指標の両方が同じトランザクション内で作成されていない(そして問題の問題インデックスはname後で作成された場合

  1. は、 propertyKeyがすでに定義された)、その後、あなたはTitan docsあたりとして、REINDEXを発行する必要があります

    をグラフインデックスの名前は一意である必要があります。新しく定義されたプロパティキー に対して作成されたグラフインデックス、つまりインデックスと同じ管理トランザクション で定義されたプロパティキーはすぐに利用可能です です。すでに であるプロパティキーに対して作成されたグラフインデックスは、 インデックスに以前に追加されたすべての要素が含まれていることを確認するために、再インデックスプロシージャを実行する必要があります。再インデックス プロシージャが完了するまで、索引は使用できません。 初期スキーマと同じトランザクションでグラフインデックスを定義することをお勧めします。

  2. 指数は、あなたがmgmt.awaitGraphIndexStatus()を使用したい場合には、INSTALLEDREGISTEREDから移動するのにかかるプロセスがタイムアウトすることができます。ここで待つ時間も指定できます。

  3. hereのように、グラフに未処理トランザクションがないこと、またはインデックスステータスが実際には変更されないことを確認してください。

  4. これは明らかではありませんが、新たに作成されたpropertyKeyと以前に使用されたpropertyKeyに対してインデックスを作成すると、TitanにはJanusGraphで修正されたバグ(this PRREGISTERED状態

  5. クラスタ内のすべてのTitan/JanusGraphノードがインデックス作成を承認しない限り、インデックスはREGISTEREDに移動しません。インデックスがINSTALLED状態になっている場合は、システム内の他のノードがインデックス存在を認識していない可能性があります。これは、クラスタ内の別のサーバーに関する問題、Titan/JanusGraphが互いにやりとりするために使用するメッセージングキューのバックフィル、または予期せぬことにファントムインスタンスの存在によるものです。これらは、正常ではないJVMのシャットダウンプロセス、つまりkill -9によってサーバーが強制終了されるたびに発生する可能性があります。これは、サーバーが世界ガベージコレクションをスラッシュしているためです。バックフィルが問題になると思われる場合は、this classのコメントは、問題を解決するのに役立つカスタマイズ可能な構成オプションに優れた洞察を提供します。ファントムノードの存在を確認するには、this functionthis functionを使用してファントムインスタンスを消去します。

+0

ありがとうございます!私はいくつかのことを試みます。 'awaitGraphIndexStatus()'のタイムアウトをどのように延長するか頭の中から何か知っていますか?また、私が再インデックス化するために必要な状態は何ですか?これは 'INSTALLED'から行うことはできません –

+0

2番目の答え[ここ](http://stackoverflow.com/questions/35656531/unable-to-create-a-composite-index-stuck-at-installed)に答える必要がありますあなたのためのそれらの両方の質問!がんばろう! – David

+0

私は最初に言ったつもりです^ – David

関連する問題