2016-11-14 110 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