2017-07-28 5 views
2

マークが存在する場合はgenerate-modern.groovyグラフを確認するためにJUnitテストを作成しました。
マイグレムリンクエリはTitan/Janusで強制インデックスを有効にするとインデックス作成に失敗する

が "g.V()( '名前'、 'マルコ')があります。";

generate-modern.groovyファイルでは、人物の名前プロパティにインデックスが既に適用されていることがわかります。 私は後でグラフ全体のスキャンは、それによって必須インデックスを作成することのブロックdynamodb.propertiesファイルでtrue次

query.force-指数=真

財産を作りました。 それは私にあなたが例外が発生方法から観察することができ、上記のように例外は、次のStandardJanusGraphTxクラスのメソッド

@Override 
    public Iterator<JanusGraphElement> execute(final GraphCentricQuery query, final JointIndexQuery indexQuery, final Object exeInfo, final QueryProfiler profiler) { 
     Iterator<JanusGraphElement> iter; 
     if (!indexQuery.isEmpty()) { 
      List<QueryUtil.IndexCall<Object>> retrievals = new ArrayList<QueryUtil.IndexCall<Object>>(); 
      for (int i = 0; i < indexQuery.size(); i++) { 
       final JointIndexQuery.Subquery subquery = indexQuery.getQuery(i); 

       retrievals.add(new QueryUtil.IndexCall<Object>() { 
        @Override 
        public Collection<Object> call(int limit) { 
         final JointIndexQuery.Subquery adjustedQuery = subquery.updateLimit(limit); 
         try { 
          return indexCache.get(adjustedQuery, new Callable<List<Object>>() { 
           @Override 
           public List<Object> call() throws Exception { 
            return QueryProfiler.profile(subquery.getProfiler(), adjustedQuery, q -> indexSerializer.query(q, txHandle)); 
           } 
          }); 
         } catch (Exception e) { 
          throw new JanusGraphException("Could not call index", e.getCause()); 
         } 
        } 
       }); 
      } 


      List<Object> resultSet = QueryUtil.processIntersectingRetrievals(retrievals, indexQuery.getLimit()); 
      iter = com.google.common.collect.Iterators.transform(resultSet.iterator(), getConversionFunction(query.getResultType())); 
     } else { 
      if (config.hasForceIndexUsage()) throw new JanusGraphException("Could not find a suitable index to answer graph query and graph scans are disabled: " + query); 
      log.warn("Query requires iterating over all vertices [{}]. For better performance, use indexes", query.getCondition()); 

      QueryProfiler sub = profiler.addNested("scan"); 
      sub.setAnnotation(QueryProfiler.QUERY_ANNOTATION,indexQuery); 
      sub.setAnnotation(QueryProfiler.FULLSCAN_ANNOTATION,true); 
      sub.setAnnotation(QueryProfiler.CONDITION_ANNOTATION,query.getResultType()); 

      switch (query.getResultType()) { 
       case VERTEX: 
        return (Iterator) getVertices().iterator(); 

       case EDGE: 
        return (Iterator) getEdges().iterator(); 

       case PROPERTY: 
        return new VertexCentricEdgeIterable(getInternalVertices(),RelationCategory.PROPERTY).iterator(); 

       default: 
        throw new IllegalArgumentException("Unexpected type: " + query.getResultType()); 
      } 
     } 

     return iter; 
    } 

}; 

から上げて

org.janusgraph.core.JanusGraphException: Could not find a suitable index to answer graph query and graph scans are disabled: [(name = marko)]:VERTEX 

次の例外をスローしかしときJointIndexQueryオブジェクト空(arrayListは空)で、強制インデックスはtrueです。
問題はリストが空である理由ですか? JUnit Testからクエリーを実行しているときにgenerate-modern.groovyのnameプロパティに対するインデックス付けクエリを指定したときに、同じデータがgremlinサーバーに同じファイルで事前ロードされているときにリストが空でないことを意味します。

+0

をもっと読むことができますか?ここで起こっていることがたくさんあります。単に 'generate-modern.groovy'スクリプトを使ってサーバの外部にあるものを読み込もうとするなら、サーバライフサイクルのフックとして動作するように設定されているので、実際には問題はありません何かを生成する。そうでない場合、テストで使用しているグラフに頂点ラベルを作成していれば、スクリプトはインデックスを作成しません。 – pantalohnes

+0

いいえサーバーの作成時にスクリプトをロードしています。フォースインデックスプロパティをfalseに切り替えると、テストケースが正常に渡されたように、この事実を確認しました。 –

+0

'force-index'をfalseに変更した後、成功すると、単純なインデックスが作成されていないことがわかります。 これをロードしようとしているグラフに既にデータがありますか? https://github.com/pluradj/titan-tp3-driver-example/blob/master/scripts/generate-modern.groovy#L13では、既存の頂点ラベルがない空のグラフを使用していると想定しています。 – pantalohnes

答えて

1

personByNameindex definitionはラベル制約を使用します。

def personByName = mgmt.buildIndex("personByName", Vertex.class).addKey(name).indexOnly(person).buildCompositeIndex() 

このインデックスを利用するには、ラベルとプロパティを使用する必要があります。たとえば:

g.V().has('person', 'name', 'marko') 

あなたは、あなたの全体の失敗JUnitテストを提供することができJanusGraphのドキュメントにこれについてhttp://docs.janusgraph.org/latest/indexes.html#_label_constraint

関連する問題