尝试在titan graph db中使用索引时出错

时间:2015-10-04 21:15:32

标签: titan gremlin tinkerpop rexster

使用以下命令使用索引以更好地查询titan db中的节点。

TitanManagement mgmt = graph.openManagement();
PropertyKey buyer = mgmt.makePropertyKey("buyer").dataType(String.class).cardinality(Cardinality.SINGLE).make();
TitanGraphIndex buyeri = mgmt.buildIndex("buyer", Vertex.class).addKey(buyer).buildCompositeIndex();
mgmt.setConsistency(buyeri, ConsistencyModifier.LOCK);
g.V().has("buyer","buyer", "buyer10").out("order_is").values("order").fill(list);     

使用titan 1.0.0,gremlin查询语言,在运行此查询时会抛出错误:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
at java.lang.Thread.run(Thread.java:745)Caused by: com.thinkaurelius.titan.core.SchemaViolationException: Adding this property for key [~T$SchemaName] and value [rtbuyer] violates a uniqueness constraint [SystemIndex#~T$SchemaName]
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.addProperty(StandardTitanTx.java:780)
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.addProperty(StandardTitanTx.java:706)
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.makeSchemaVertex(StandardTitanTx.java:836)
at com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx.makePropertyKey(StandardTitanTx.java:856)
at com.thinkaurelius.titan.graphdb.types.StandardPropertyKeyMaker.make(StandardPropertyKeyMaker.java:86)
at pluradj.titan.tinkerpop3.example.JavaExample2.main(JavaExample2.java:56)

@jason Plurad回答

中提到的更新

我用过

 PropertyKey buyer = (!mgmt.containsPropertyKey("buyer")) ?
        mgmt.makePropertyKey("buyer").dataType(String.class).cardinality(Cardinality.SINGLE).make() :
        mgmt.getPropertyKey("buyer");
    TitanGraphIndex buyeri = mgmt.getGraphIndex("buyeri");
    if (buyeri == null) {
        VertexLabel buyr = mgmt.getVertexLabel("buyer");
        buyeri = mgmt.buildIndex("buyeri", Vertex.class).addKey(buyer).indexOnly(buyr). buildCompositeIndex();
        mgmt.setConsistency(buyeri, ConsistencyModifier.LOCK);
    }

    mgmt.commit();
     st=System.currentTimeMillis();
     g.V().has("buyer","buyer", "buyer10").out("order_is").values("order").fill(list);     
     System.out.println(System.currentTimeMillis()-st +"millllli");

使用以下代码索引买家,使搜索顶点更快,但不知道为什么它没有索引不起作用,任何人都可以解决这个问题。

我已经阅读了titan db索引部分的文档,但我猜它不起作用..

1 个答案:

答案 0 :(得分:5)

此处的问题在堆栈跟踪中表示:

<key>UISupportedInterfaceOrientations~ipad</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>

您的代码正在尝试多次创建架构(可能是通过重复调用您的程序)。上面的架构创建代码在尝试创建属性键之前不会检查它是否存在。

您对Caused by: com.thinkaurelius.titan.core.SchemaViolationException: Adding this property for key [~T$SchemaName] and value [rtbuyer] violates a uniqueness constraint [SystemIndex#~T$SchemaName] 的使用是寻找具有顶点标签&#34;买方&#34;以及顶点属性&#34;买方&#34;的顶点。等于&#34;买家10&#34;。您的架构定义定义没有顶点标签,所以我认为has("buyer", "buyer", "buyer10")更合适。

查看此示例,您可以从gremlin.sh运行。它使用索引并且不显示任何警告消息。

has("buyer", "buyer10")