我有一个带有几个索引的图表 . 它们是两个具有标签限制的综合指数 . (两者在不同的属性/标签上完全相同) . 一个肯定似乎工作,但另一个没有 . 我已完成以下配置文件()以加倍检查:
一个名为 KeyOnNode
:property uid
,label 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
:property name
和label 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.ManagementSystem@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)
==>com.thinkaurelius.titan.graphdb.types.SchemaSource$Entry@26b2b8e2
gremlin> sse = rel.iterator().next()
==>com.thinkaurelius.titan.graphdb.types.SchemaSource$Entry@2d39a135
gremlin> sse.getSchemaType()
==>supernode
我不能只在这时重置数据库 . 任何有助于确定问题的帮助都会令人惊叹,我在这里碰到了一堵墙 . 这是我需要重新索引的标志吗?
信息:Titan DB 1.1(TP 3.1.1)
干杯
UPDATE : 我发现有问题的索引不是 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();
但似乎没有做任何事情
UPDATE 2 : 我试过注册索引以便使用以下内容重新编制索引:
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个边缘 .
2 回答
所以这里有一些事情可以发生:
name
propertyKey
之后创建的)那么您应该根据Titan docs发出reindex:索引可能会超时从
REGISTERED
移动到INSTALLED
的过程,在这种情况下,您要使用mgmt.awaitGraphIndexStatus()
. 您甚至可以指定您愿意在此等待的时间 .确保图表上没有未结交易,或者索引状态确实不会改变,如here所述 .
这显然不是你的情况,但是Titan中有一个错误(在JanusGraph中通过this PR修复),这样如果你为新创建的propertyKey和以前使用过的propertyKey创建一个索引,那么索引将陷入困境
REGISTERED
州索引不会移动到
REGISTERED
,除非群集中的每个Titan / JanusGraph节点都确认索引创建 . 如果索引陷入INSTALLED
状态,则系统中的其他节点可能无法确认索引是否存在 . 这可能是由于集群中另一台服务器的问题,Titan / JanusGraph用于相互通信的消息队列中的回填,或者最意外的是:存在幻像实例 . 每次服务器通过非正常的JVM关闭进程被杀死时都会发生这些情况,即由于服务器被卡在世界垃圾收集中而导致服务器停止运行 . 如果您希望回填成为问题,那么this class中的注释可以提供对可自定义配置选项的深入了解,这些选项可能有助于解决问题 . 要检查是否存在幻像节点,请使用this function然后使用this function来终止幻像实例 .我认为你错过了图表的配置 . 如果您使用后端是cassandra,则必须使用elasticsearch进行配置 . 如果您使用后端是hbase,则必须使用缓存进行配置 . 阅读下面的链接:https://docs.janusgraph.org/0.2.0/configuration.html