2016-10-03 77 views
1

我试图创建一个顶点label.Vertex创建索引如下是否有可能建立索引标签在顶点

val v0 = graph + "A" 

我的每一个精怪查询基于以下warining消息

顶点label.Getting

WARN cttgtransaction.StandardTitanTx - 查询需要迭代所有顶点[(〜label = 301)]。为了获得更好的性能,使用索引

项目使用泰坦+卡桑德拉(存储后端),以下是依赖关系中使用的SBT,

"com.michaelpollmeier" %% "gremlin-scala" % "3.0.2-incubating.2", 
"com.thinkaurelius.titan" % "titan-core" % "1.0.0", 
"com.thinkaurelius.titan" % "titan-cassandra" % "1.0.0", 
"com.netflix.astyanax" % "astyanax-cassandra" % "3.9.0", 
"com.netflix.astyanax" % "astyanax-core" % "3.9.0", 
"com.netflix.astyanax" % "astyanax-thrift" % "3.9.0" 

创建如下指标,

mgmt.makePropertyKey("endpoint").dataType(classOf[String]).m‌​ake(); 

mgmt.buildIndex("endpoint",classOf[Vertex]).addKey(name1).un‌​ique().buildComposit‌​eIndex() 

mgmt.commit() 

graph.tx().commit() 

收到此错误

com.thinkaurelius.titan.core.SchemaViolationException:为键[〜T $ SchemaName]和值[rtendpoint]添加此属性违反了唯一性约束[SystemIndex#〜T $的SchemaName]

+0

而不是连续发表评论,你应该修改自己的问题与这些额外的信息。它使你的问题更容易理解,你可能会从社区获得更多帮助。 –

+0

删除了评论并更新了最新的问题 – Gopi

回答

2

根据this

是你可以轻松访问底层小鬼-Java对象如果需要的话,例如访问图形分析细节东西像索引

因此,我假设过程应该是与定义here相同。

基于这一假设,首先,您将索引应用于属性而不是标签。然而,在加载数据的高级中创建图表模式是一个好主意。话虽这么说你可能要做到以下几点:

TitanManagement management = graph.openManagement(); 

1.定义你的顶点标签

这是可以做到的:

VertexLabel foundLabel = management.getVertexLabel("A"); 
if(foundLabel == null) 
    management.makeVertexLabel("A").make(); 

2.定义你的属性

这让泰坦知道哪些属性可以预期索引:

if (management.getPropertyKey("ID") == null) { 
    management.makePropertyKey("ID").dataType(String.class).make(); 
} 

3.定义索引属性

索引时属性,然后你对这些属性遍历会快很多:

TitanIndex index = management.getGraphIndex("byID"); 
if(index == null) { 
    PropertyKey key = management.getPropertyKey("ID"); 
    TitanManagement.IndexBuilder indexBuilder = management.buildIndex("byID", Vertex.class).addKey(key); 
    if (isUnique) //Do you want the property to be unique ? 
     indexBuilder.unique(); 
    indexBuilder.buildCompositeIndex(); 
} 
+0

Teixeria非常感谢您的回答。我对此没有怀疑。 ** 1。定义顶点标签**为什么我们需要这样做? ** 2 **。当我们创建顶点时,我们需要用一些值来设置这个属性(ID),并且使用ID来遍历,而不是使用'hasLabel'对吗? – Gopi

+0

提前定义它通常是很好的做法。这不是建议的,但有时当你有很多索引和很多属性时,如果你试图创建一个新的标签,Titan会抱怨它是一个SchemaViolation。 至于你的第二个问题,是的,这是正确的。要使用索引,您应该遍历属性,而不是标签。我只是使用'ID'作为例子。 –

+1

非常感谢。我修改了我的quries,如下图graph.V()。has(ID,A).out()。label()。toList()'。现在WARN消息不会来。 – Gopi

相关问题