Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当唯一性基于节点属性和关系的存在时,在Neo4j中进行合并_Neo4j - Fatal编程技术网

当唯一性基于节点属性和关系的存在时,在Neo4j中进行合并

当唯一性基于节点属性和关系的存在时,在Neo4j中进行合并,neo4j,Neo4j,在我的模型中,我有两种类型的节点;系统和数据集。每个数据集都属于一个系统。这由包含数据集关系表示 作为一般规则;数据集名称在给定系统中必须是唯一的。如果数据集包含在不同的系统中,我允许使用重复的数据集名称 我正试图通过密码来执行这一点,这样;当有人试图创建包含在系统中的数据集时;只有当数据集的名称与系统中包含的现有数据集不匹配时,密码才会创建新数据集 我想我需要一个MERGE语句,它包含一个基于与系统的关系的过滤条件,但我不知道怎么做。我已经包含了我下面使用的代码,但它只是一个不考虑数据集驻

在我的模型中,我有两种类型的节点;系统和数据集。每个数据集都属于一个系统。这由包含数据集关系表示

作为一般规则;数据集名称在给定系统中必须是唯一的。如果数据集包含在不同的系统中,我允许使用重复的数据集名称

我正试图通过密码来执行这一点,这样;当有人试图创建包含在系统中的数据集时;只有当数据集的名称与系统中包含的现有数据集不匹配时,密码才会创建新数据集

我想我需要一个MERGE语句,它包含一个基于与系统的关系的过滤条件,但我不知道怎么做。我已经包含了我下面使用的代码,但它只是一个不考虑数据集驻留的系统的合并。

:params
  "data": {
    "System": [
      {
        "name": "System 1",
        "datasets": [
          {
            "name": "Customers"
          }
        ]
      },
      {
        "name": "System 2",
        "datasets": [
          {
            "name": "Customers"
          }
        ]
      },
      {
        "name": "System 3",
        "datasets": [
          {
            "name": "Products"
          }
        ]
      }
    ]
  }

上面的查询还创建了2个我不期望的额外节点,因此,如果您有任何帮助,也将不胜感激:


您离这里很近,您的密码实际上有您需要的解决方案:

MERGE (sy)-[:CONTAINS_DATASET]->(dan:Dataset { name: datasets.name })
此模式有一个绑定(以前与图形元素匹配)变量
sy
,和一个未绑定(以前未与任何内容匹配,在查询中首次出现)变量
dan

合并就像对模式进行匹配,然后行为将根据图形中是否存在该模式而改变

如果它存在于图形中(
sy
与具有给定名称的:数据集节点具有:CONTAINS\u数据集关系),则它将重用现有图形结构,并且
dan
将绑定到该现有连接节点

如果图形中不存在,则将创建整个模式,这将包括创建任何以前未绑定的节点,如
dan
。如果模式不存在,它将锁定模式的绑定部分(
sy
),进行双重检查以确保在检查时间和锁定时间之间没有任何更改,然后它将创建之前未绑定的模式部分
sy
以前已绑定,因此它将使用同一个节点,而不是创建新节点
(dan:Dataset{name:datasets.name})
以前未绑定,因此将创建具有此标签和此属性的新节点,并通过:CONTAINS\u数据集关系连接到
sy

因此,这种行为应该正是您所需要的,重用具有该名称的已连接节点(如果存在),或者使用该名称创建一个全新的节点,并按照
sy
节点进行连接

至于你看到的复制品,这是因为在那一行之前有一行:

MERGE (da:Dataset { name: datasets.name})
这里不需要这样做,您已经用后面的行满足了您的需求,所以删除它,您的查询应该可以工作


有关中合并行为的更多详细信息

非常感谢您的详细回复。遵循您的指导原则,它的工作正如我所期望的,但更重要的是,我能够理解它为什么工作!
MERGE (da:Dataset { name: datasets.name})