2013-07-01 65 views
3

我正在使用一個框架生成對象Node,他們已經分配了一個ID。現在,他們需要轉換到泰坦頂點與框架(與node.id訪問)控制的相同ID如何覆蓋Titan數據庫中的頂點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 

但似乎不答應。我應該使用一些虛假的財產來模仿一個輔助ID嗎?泰坦是否有辦法做到這一點?

謝謝!

回答

8

很少有圖形數據庫實際允許您設置元素標識符。無論您使用的是Neo4j,OrientDB,Titan等,它們都傾向於擁有自己的ID系統.TinkerGraph是唯一允許ID分配的Blueprints實現。

如果你想保留你的ID,那麼你應該簡單地將它重命名爲別的。也許你可以使用「iid」來代替「id」。爲了讓事情變得更加透明,從編程的角度來看,你可能會考慮使用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本身。幕後實際上只是使用關鍵指數。

+0

好的答案!謝謝!我的上下文唯一的問題是,我想在基準測試中使用或不使用關鍵指標。它索引數據庫中的頂點查找或者索引自定義id x真實id之間的賦值?再次感謝 – Luccas

+1

如果您需要在沒有關鍵指標的情況下工作,請使用「id」以外的名稱(例如「iid」)創建一個屬性名稱。你沒有提到你的基準是什麼,但沒有關鍵指標,你可能會看到一些相當不好的結果,因爲「iid」的查詢最終將成爲線性掃描。你問我問的問題與泰坦如何存儲關鍵指數本身有關。如果是這樣,這個鏈接可能會有所幫助:https://github.com/elffersj/delftswa-aurelius-titan/blob/master/SA-doc/Mapping.md –

+0

如果你想邊緣上的自定義ID也IdGraph(base,true,真的),那麼你可能需要創建__id屬性之前,我需要它在0.3.0 https://github.com/thinkaurelius/titan/issues/179 –

1

@Stephen,不能說關於gremlin終端,但試圖通過泰坦Java API,並沒有奏效。 即使在id圖形中創建頂點時傳遞了id,默認id也被分配給了節點。

+0

我有同樣的問題,'TitanGraph'實例無法作爲'base'傳遞給'IdGraph':/ –