如何处理密码查询常见节

时间:2018-07-25 03:31:47

标签: neo4j cypher

我正在编写一堆查询以便在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)引用了两个不同的节点,因为它们的父节点不同。

1 个答案:

答案 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已经获取所有内容的情况下,将完成所有更改。