2017-07-28 130 views
2

如果存在marko,我已经编写了一个JUnit测试来检查generate-modern.groovy图。
我的小鬼查询是在Titan/Janus中启用强制索引时索引失败

“g.V()有( '名', '马尔科')。”;

正如您在generate-modern.groovy文件中看到的那样,索引已经应用于人员的name属性。 我后来提出了以下

query.force指数=真

属性真在dynamodb.properties文件哪些块整个图形扫描从而使分度强制性的。 但是它抛出我下面的例外

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

上述异常是从以下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; 
    } 

}; 

提出你可以从该引发异常的方法观察时JointIndexQuery对象是空的(arrayList为空)并且强制索引为真。
问题是为什么列表为空?当我们在从JUnit Test中查询时针对generate-modern.groovy中的name属性指定索引查询。这很好地工作,这意味着当相同的数据被预加载到具有相同文件的gremlin服务器时,列表不是空的。

+0

你能提供你的整个失败的JUnit测试?这里可能会发生很多事情。如果您只是简单地使用'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

回答