2017-02-14 53 views
4

Neo4j或SDN4可能創建/模擬類似於PostgreSQL序列數據庫對象的東西嗎?Neo4j SDN 4模擬序列對象(不是UUID)

我需要這個線程安全的功能,以便能夠問它下一個獨特的Long值。我將使用這個值作爲我的實體的代理鍵。

修訂

我不想UUID去,因爲我要在我的Web應用程序URL參數,並在UUID情況下,我的網址看起來糟透了揭露這些ID。我想用一個簡單的Long值去ID,如StackOverflow的那樣,例如:

stackoverflow.com/questions/42228501/neo4j-sdn-4-emulate-sequence-objectnot-uuid 

回答

0

在Neo4j的最簡單的方法是禁用IDS重用和使用節點圖ID喜歡序。

https://neo4j.com/docs/operations-manual/current/reference/configuration-settings/

Table A.83. dbms.ids.reuse.types.override 

Description: Specified names of id types (comma separated) that should be reused. Currently only 'node' and 'relationship' types are supported. 

Valid values: dbms.ids.reuse.types.override is a list separated by "," where items are one of NODE, RELATIONSHIP 

Default value: [RELATIONSHIP, NODE] 
1

號據我所知沒有任何類似的功能在Neo4j的序列或自動增量標識符。這個問題過去也是asked a few times

APOC項目可能值得檢查這個。似乎有一個請求add it

2

這可以通過用戶程序和功能來完成。舉個例子:

package sequence; 

import org.neo4j.procedure.*; 
import java.util.concurrent.atomic.AtomicInteger; 

public class Next { 
    private static AtomicInteger sequence = new AtomicInteger(0); 

    @UserFunction 
    public synchronized Number next() { 
     return sequence.incrementAndGet(); 
    } 
} 

這個例子的問題是,當服務器重新啓動時,計數器將被設置爲零。

所以有必要保持計數器的最後一個值。這可以通過使用這些例子來完成:

https://maxdemarzi.com/2015/03/25/triggers-in-neo4j/

https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/master/src/main/java/apoc/trigger/Trigger.java

+0

這並沒有真正增加任何額外的好處,如果創業公司之間使用。如果僅在服務器運行時使用,那麼內部的Neo4j ID無論如何都會更好。 – digx1

+0

@ digx1 Neo4j id不是增量序列。 –

+1

FWIW Neo4j ID大部分是按順序分配的。關鍵是這個解決方案對於那些試圖在重新啓動時爲每個標籤創建一個序列的人來說並不是非常有用。這個解決方案或者需要一個命名空間來複制postgres序列所做的事情,或者實際上只需要構建APOC過程:https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/225就可以做到這一點。 – digx1

1

如果你的主要興趣是有一種方法來生成唯一的ID,你不介意的唯一ID是字符串,那麼你應考慮使用APOC設施生成UUIDs

有一個APOC函數可以生成一個UUID,apoc.create.uuid在較早版本的APOC中,這是一個必須使用CALL語法調用的過程。例如,創建和使用一個新的UUID返回單個節點Foo

CREATE (f:Foo {uuid: apoc.create.uuid()}) 
RETURN f; 

還有一個APOC程序,apoc.create.uuids(count),生成的UUID的指定次數。例如,創建和使用新的UUID返回5個Foo節點:

CALL apoc.create.uuids(5) YIELD uuid 
CREATE (f:Foo {uuid: uuid}) 
RETURN f; 
+0

謝謝,但我不想用UUID去,因爲我必須在我的Web應用程序的URL參數中公開這些ID,並且在UUID的情況下我的URL看起來很糟糕。我想用一個普通的Long值作爲ID。 – alexanoid