マークが存在する場合は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サーバーに同じファイルで事前ロードされているときにリストが空でないことを意味します。
をもっと読むことができますか?ここで起こっていることがたくさんあります。単に 'generate-modern.groovy'スクリプトを使ってサーバの外部にあるものを読み込もうとするなら、サーバライフサイクルのフックとして動作するように設定されているので、実際には問題はありません何かを生成する。そうでない場合、テストで使用しているグラフに頂点ラベルを作成していれば、スクリプトはインデックスを作成しません。 – pantalohnes
いいえサーバーの作成時にスクリプトをロードしています。フォースインデックスプロパティをfalseに切り替えると、テストケースが正常に渡されたように、この事実を確認しました。 –
'force-index'をfalseに変更した後、成功すると、単純なインデックスが作成されていないことがわかります。 これをロードしようとしているグラフに既にデータがありますか? https://github.com/pluradj/titan-tp3-driver-example/blob/master/scripts/generate-modern.groovy#L13では、既存の頂点ラベルがない空のグラフを使用していると想定しています。 – pantalohnes