如何在Titan数据库中覆盖顶点ID?

时间:2013-07-01 04:29:07

标签: nosql neo4j titan

我正在使用一个生成对象Node的框架,并且他们已经分配了一个id。现在需要将它们转换为Titan顶点,并在框架中控制相同的ID(使用node.id访问)

public long addNode(Node node) {    
   TitanVertex vertex = (TitanVertex) g.addVertex(null);
   g.commit();

   vertex.setProperty(ID, node.id);
   vertex.setProperty(TYPE, node.type);
   vertex.setProperty(VERSION, node.version);
   vertex.setProperty(TIME, node.time);
   vertex.setProperty(DATA, node.data);
   ...

错误:

java.lang.IllegalArgumentException: Name is reserved: id

但它似乎不允许它。我应该使用一些虚假财产来模仿二级身份证吗?泰坦有办法做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:8)

很少有图形数据库实际上允许您设置元素标识符。无论您使用的是Neo4j,OrientDB,Titan等,它们都倾向于拥有自己的ID系统.TinkerGraph实际上是唯一允许ID分配的蓝图实现。

如果您想保留自己的ID,则只需将其重命名为其他内容即可。而不是“id”,也许你可以使用“iid”。为了使事情更加透明,从编程的角度来看,您可以考虑使用IdGraph包装器,这将允许您执行以下操作:

gremlin> base = TitanFactory.open('/tmp/titan-berkley')
==>titangraph[local:/tmp/titan-berkley]
gremlin> g = new IdGraph(base, true, false)            
==>idgraph[titangraph[local:/tmp/titan-berkley]]
gremlin> g.addVertex(45)  
==>v[45]
gremlin> g.v(45)
==>v[45]

您可以看到IdGraph允许它显示为您正在分配元素ID本身。在幕后,它实际上只是使用关键索引。

答案 1 :(得分:1)

@Stephen,不能说关于gremlin终端,但是通过Titan Java API尝试了这个并且它没有用。 即使在id图中创建顶点时传递id,也会将默认id分配给节点。