Índice de ignição do Titan Db
Eu tenho um gráfico com alguns índices. Eles são dois índices compostos com restrições de etiqueta. (ambos são exatamente iguais apenas em propriedades / rótulos diferentes). Um definitivamente parece funcionar, mas o outro não. Eu fiz o seguinte perfil () para a verificação dobrada:
Um é chamadoKeyOnNode
: propriedadeuid
e etiquetanode
:
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 -
O acima é perfeitamente aceitável e funciona bem. Estou assumindo que a linha mágica ébackend-query
.
O outro é chamadoNameOnSuperNode
: propriedadename
e etiquetasupernode
:
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 -
Aqui, a consulta leva uma quantidade exorbitante de tempo e temos umascan
linha. Originalmente, eu me perguntava se o índice não era confirmado pelo sistema de gerenciamento, mas infelizmente o seguinte parece funcionar bem:
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
Não posso simplesmente redefinir o db neste momento. Qualquer ajuda para identificar quais seriam os problemas seria incrível, estou batendo aqui. Isso é um sinal de que preciso reindexar?
INFO: Titan DB 1.1 (TP 3.1.1)
Felicidades
ATUALIZAÇÃO: Descobri que o índice em questão não está em umREGISTERED
Estado:
gremlin> :> m = graphT.openManagement(); index = m.getGraphIndex("NameOnSuperNode"); pkey = index.getFieldKeys()[0]; index.getIndexStatus(pkey)
==>INSTALLED
Como faço para registrar? eu tenteim.updateIndex(index, SchemaAction.REGISTER_INDEX).get(); m.commit(); graphT.tx().commit();
mas parece não fazer nada
ATUALIZAÇÃO 2: Tentei registrar o índice para reindexar com o seguinte:
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()
Mas isso não está funcionando. Eu ainda tenho meu índice noINSTALLED
status e ainda estou recebendo um tempo limite. Eu verifiquei que não havia transações em aberto. Alguém tem uma ideia? Para sua informação, o gráfico está sendo executado em um único servidor e possui ~ 100K de vértices e ~ 130k de bordas.