我有一些带有节点的数据库。每个节点都有一个内部ID,默认情况下,该ID是在创建节点时由Neo4j数据库自动生成的。
是否可以将此ID复制到属性?我的意思是以下效果:
MATCH (n)
WHEN id(n)=4
RETURN n
它返回。
n{id : 4}
我需要对每个节点进行此转换。有任何想法吗?此外,如果我要搜索该属性,在该属性上创建索引是个好主意吗?我该怎么办?
答案 0 :(得分:0)
这是可能的。
我会问:您确定这是针对您的用例的最佳解决方案吗?我问的原因是,如果删除节点,则其原始ID可能会再次用于其他节点。这可能会导致意外结果,具体取决于您的应用程序/查询将如何利用该ID。
将内部ID映射到所有节点的属性的方法如下:
match (n) set n.id = id(n)
当您在ID属性上进行搜索时,索引将使搜索速度更快-但这是一个好主意吗?可能这是个好主意,但这取决于速度对您而言的重要程度,数据库的大小,节点的创建和删除频率(此频率越频繁,索引将用于的存储/开销越多)。要求),以及数据库上有多少可用存储空间。
Neo4j中的索引被映射到标签-它们可以是单属性索引或复合(多属性)索引。假设您要为标签为:Person 的那些节点的ID属性创建索引-您可以使用以下代码实现此目的:
CREATE INDEX ON :Person(id)
如果发现索引不是一个好主意,则始终可以删除索引-请参阅以下内容:
DROP INDEX ON :Person(id)
如果愿意,您可以在Neo4j's official developer manual中阅读有关索引的更多信息。
答案 1 :(得分:0)
使用neo4j id属性不是一个好主意。如果过一会儿删除某个节点,neo4j可能会将其用于新节点。由于我提到的原因和其他原因,not recommended使用id。您可以使用uuid或其他方法来创建唯一ID。 github project可以为您提供帮助。
您可以这样复制ID:
MATCH (n) SET n.id = id(n)
创建一个索引:
CREATE INDEX ON :Person(id)
创建一个复合索引:
CREATE INDEX ON :Person(id, firstname)
有关索引的更多信息,请阅读docs。
答案 2 :(得分:0)
您永远不需要将节点的本机ID存储为该节点的属性。
您已经知道,可以通过ID()
函数轻松获取每个节点(和关系)的本机ID。
您还可以通过其本机ID轻松获得节点(或关系),而无需索引(关系甚至不支持索引)。实际上,通过本机ID进行查询比索引更为有效。例如,您的查询(将WHEN
替换为正确的WHERE
之后)已经尽可能快:
MATCH (n)
WHERE ID(n) = 4
RETURN n;
注意:在上面的示例中,您不应假定在查询4
的本机ID时总是返回相同的节点。如果要删除具有该ID的原始节点,则此后可以将相同的ID分配给新节点。因此,您需要仔细考虑依赖本机ID是否适合您的用例。