Neo4j 中所有 nodes/relationships 的可靠(自动)递增标识符
Reliable (auto)incrementing identifiers for all nodes/relationships in Neo4j
我正在寻找一种方法,根据递增计数器(不是大而长的 uuid)为我在 Neo4j 中的所有 nodes/relationships 生成唯一标识符。
已知由 Neo4j 引擎维护的内部 ID 作为外部参考并不可靠。
接近的解决方案是 ,但当单个 CREATE
子句创建多个新节点时它不起作用:
// get unique id
MERGE (id:UniqueId{name:'Person'})
ON CREATE SET id.count = 1
ON MATCH SET id.count = id.count + 1
WITH id.count AS uid
// create a new node attached to every existing :something node
MATCH (n:something)
CREATE (:somethingRelated {id:uid}) -[:rel]-> (n)
当有多个(n:something)
时,每个新创建的(:somethingRelated)
将共享相同的id。有没有办法解决这个问题,只使用 Cypher?
在我看来,在 Cypher 中不可能做到这一点。
我建议你为此编写 Java 扩展,因为你使用 Cypher 的方法在并发环境中不起作用。您无法确保唯一性。
您能否告诉我们更多关于您的用例以及您不使用 UUID 的原因? - https://github.com/graphaware/neo4j-uuid
根据您在下方的评论,我建议在您的应用程序中创建 ID。
试试这个来分配一个 ID 块:
// collect nodes to connect
MATCH (n:Crew) WITH collect(n) AS nodes
MERGE (id:UniqueId { name:'Person' })
// reserve id-range
SET id.count = coalesce(id.count,0)+ size(nodes)
WITH nodes, id.count - size(nodes) AS base
// for each index
UNWIND range(0,size(nodes)-1) AS idx
// get node, compute id
WITH nodes[idx] AS n, base +idx AS id
CREATE (:SomethingRelated { uid:id })-[:rel]->(n)
我正在寻找一种方法,根据递增计数器(不是大而长的 uuid)为我在 Neo4j 中的所有 nodes/relationships 生成唯一标识符。
已知由 Neo4j 引擎维护的内部 ID 作为外部参考并不可靠。
接近的解决方案是 CREATE
子句创建多个新节点时它不起作用:
// get unique id
MERGE (id:UniqueId{name:'Person'})
ON CREATE SET id.count = 1
ON MATCH SET id.count = id.count + 1
WITH id.count AS uid
// create a new node attached to every existing :something node
MATCH (n:something)
CREATE (:somethingRelated {id:uid}) -[:rel]-> (n)
当有多个(n:something)
时,每个新创建的(:somethingRelated)
将共享相同的id。有没有办法解决这个问题,只使用 Cypher?
在我看来,在 Cypher 中不可能做到这一点。
我建议你为此编写 Java 扩展,因为你使用 Cypher 的方法在并发环境中不起作用。您无法确保唯一性。
您能否告诉我们更多关于您的用例以及您不使用 UUID 的原因? - https://github.com/graphaware/neo4j-uuid
根据您在下方的评论,我建议在您的应用程序中创建 ID。
试试这个来分配一个 ID 块:
// collect nodes to connect
MATCH (n:Crew) WITH collect(n) AS nodes
MERGE (id:UniqueId { name:'Person' })
// reserve id-range
SET id.count = coalesce(id.count,0)+ size(nodes)
WITH nodes, id.count - size(nodes) AS base
// for each index
UNWIND range(0,size(nodes)-1) AS idx
// get node, compute id
WITH nodes[idx] AS n, base +idx AS id
CREATE (:SomethingRelated { uid:id })-[:rel]->(n)