是否可以为顶点中的标签建立索引
Is it possible to build index for labels in vertex
我正在尝试为顶点创建索引 label.Vertex 创建如下
val v0 = graph + "A"
我的每个 gremlin 查询基于警告消息label.Getting 下面的顶点
WARN c.t.t.g.transaction.StandardTitanTx - 查询需要遍历所有顶点 [(~label = 301)]。为了更好的性能,使用索引
项目使用了Titan + cassandra(Storage Backend),以下是使用的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]).make();
mgmt.buildIndex("endpoint",classOf[Vertex]).addKey(name1).unique().buildCompositeIndex()
mgmt.commit()
graph.tx().commit()
出现这个错误
com.thinkaurelius.titan.core.SchemaViolationException:为键 [~T$SchemaName] 和值 [rtendpoint] 添加此 属性 违反了唯一性约束 [SystemIndex#~T$SchemaName]
根据this:
you can always easily access the underlying Gremlin-Java objects if needed, e.g. to access graph db specifics things like indexes
所以我假设该过程应该与定义的过程相同 here。
基于该假设,首先,您将索引应用于属性而不是标签。然而,在加载数据之前创建图形模式是个好主意。话虽如此,您可能想要执行以下操作:
TitanManagement management = graph.openManagement();
1.定义顶点标签
这可以通过以下方式完成:
VertexLabel foundLabel = management.getVertexLabel("A");
if(foundLabel == null)
management.makeVertexLabel("A").make();
2。定义您的属性
这让 Titan 知道它可以索引哪些属性:
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();
}
我正在尝试为顶点创建索引 label.Vertex 创建如下
val v0 = graph + "A"
我的每个 gremlin 查询基于警告消息label.Getting 下面的顶点
WARN c.t.t.g.transaction.StandardTitanTx - 查询需要遍历所有顶点 [(~label = 301)]。为了更好的性能,使用索引
项目使用了Titan + cassandra(Storage Backend),以下是使用的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]).make();
mgmt.buildIndex("endpoint",classOf[Vertex]).addKey(name1).unique().buildCompositeIndex()
mgmt.commit()
graph.tx().commit()
出现这个错误
com.thinkaurelius.titan.core.SchemaViolationException:为键 [~T$SchemaName] 和值 [rtendpoint] 添加此 属性 违反了唯一性约束 [SystemIndex#~T$SchemaName]
根据this:
you can always easily access the underlying Gremlin-Java objects if needed, e.g. to access graph db specifics things like indexes
所以我假设该过程应该与定义的过程相同 here。
基于该假设,首先,您将索引应用于属性而不是标签。然而,在加载数据之前创建图形模式是个好主意。话虽如此,您可能想要执行以下操作:
TitanManagement management = graph.openManagement();
1.定义顶点标签
这可以通过以下方式完成:
VertexLabel foundLabel = management.getVertexLabel("A");
if(foundLabel == null)
management.makeVertexLabel("A").make();
2。定义您的属性
这让 Titan 知道它可以索引哪些属性:
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();
}