我正在编写一堆查询以便在Neo4j内构建一棵树,但是为了添加不同类型的新数据,我为每个查询编写了相同的开头节。
示例:我希望能够添加Root(identifier=Root1)->A(identifier=1)->B(identifier=2)...
而无需修改其他根所指向的树。
我所有的查询都始于
Match
(root:`Root` {identifier=$identifier})
Create
(root)-[:`someRel`]->(a:`A` {identifier=$a_identifier})
然后一段时间,A需要一个孩子:
Match
(root:`Root` {identifier=$identifier})
-[:`someRel`]->
(a:`A` {identifier=$a_identifier})
Create
(a)-[:`someOtherRel`]->(b:`B` {identifier=$b_identifier})
再过一段时间,也许B需要一个孩子,我必须使用相同的开头节到达A,然后再添加一个以获得正确的B。
我是否缺少一些功能,这些功能使我不必每次想要到达正确的B(或C或D)时就建立这些开头节,还是只需要这样做使用字符串串联?
字符串连接示例:(python)
MATCH
{ROOT_LOOKUP_STANZA},
{A_LOOKUP_STANZA},
{B_LOOKUP_STANZA},
CREATE
(b)-[:`c_relationship`]->(c:`C` {...})
一些附加说明:
Root(root)->A(a)->B(b)
Root(root)->A(a1)->B(b)
在这种情况下,B(b)引用了两个不同的节点,因为它们的父节点不同。
答案 0 :(得分:0)
因此,您的主要问题是子代没有唯一的ID,只有根节点才具有唯一的ID。 Neo4j还没有任何机制来将一个查询的最终上下文带入另一个查询的开始,并且不保证节点内部ID在查询之间是相同的。因此,对于您的数据,您必须匹配整个链,以确保匹配要追加到的正确节点。您可以采取一些措施使此操作不必要。
添加UUID
通过向每个节点添加一个通用的唯一ID(并为该属性建立索引),您将能够在该ID上进行匹配,并确保不存在冲突,并且在所有查询中它都相同。任何时候使用节点内部ID都会很有用,这是一个好兆头,您可以在数据中使用UUID。 (如果将数据镜像到其他数据库,也有帮助)
将路径存储为唯一ID
您可能不知道Neo4j中分配的UUID(因为它不在源数据中),但是在树中您可以创建<parent-ID>_<index><sorted-labels><source-id>
格式的唯一ID。这里的想法是确保父对象具有唯一的ID,并将该ID与使该子对象对该父对象唯一的信息结合起来。这样您就可以生成确定性的唯一ID。 (需要一个具有唯一根ID的树数据结构)在大多数情况下,您可能会省略索引部分(对于源数据中的列表/数组而言)。本质上,您将从根节点到该节点的路径存储为节点的唯一ID。 (同样,您将需要在此ID上建立索引)
批处理工作
如果这只是一项工作的全部,另一种选择是合并您要进行的更改,并生成一个密码,在Neo4j已经获取所有内容的情况下,将完成所有更改。