Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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_Cypher - Fatal编程技术网

Neo4j 在单密码查询中合并之前的匹配在匹配和创建时混淆

Neo4j 在单密码查询中合并之前的匹配在匹配和创建时混淆,neo4j,cypher,Neo4j,Cypher,我在Neo4j 2.1.5上遇到过这个问题。我有一个使用Neo4j REST API从Node.js发出的查询。此查询的目的是能够创建或更新给定节点,并将其状态(包括标签和属性)设置为某些已知状态。WITH之前的MATCH and REMOVE子句解决了这样一个事实,即没有直接的方法删除节点的所有标签,也没有方法使用给定的标签集更新节点的标签。必须明确删除不需要的标签,然后添加确实需要的标签。而且在MERGE子句中无法删除标签 查询的简化版本如下所示: MATCH (m {name:'Brian

我在Neo4j 2.1.5上遇到过这个问题。我有一个使用Neo4j REST API从Node.js发出的查询。此查询的目的是能够创建或更新给定节点,并将其状态(包括标签和属性)设置为某些已知状态。WITH之前的MATCH and REMOVE子句解决了这样一个事实,即没有直接的方法删除节点的所有标签,也没有方法使用给定的标签集更新节点的标签。必须明确删除不需要的标签,然后添加确实需要的标签。而且在MERGE子句中无法删除标签

查询的简化版本如下所示:

MATCH (m {name:'Brian'}) 
REMOVE m:l1:l2 
WITH m 
MERGE (n {name:'Brian'}) 
ON MATCH SET n={mprops} ON CREATE SET n={cprops} 
RETURN n
其中mprops={updated:true,created:false}和cprops={updated:false,created:true}。我这样做是为了在单个Cypher查询中删除节点的所有现有标签,并使用ON MATCH子句设置新标签。问题在于,包含初始匹配似乎混淆了ON-MATCH和ON-CREATE逻辑

假设Brian节点已经存在,此查询的结果应该显示n.created=false和n.updated=true。然而,我得到了相反的结果,n.created=true,n.updated=false。如果我删除了最初的MATCH和WITH子句,并且只执行MERGE子句,那么结果与预期的一样。因此,在某种程度上,包含MATCH子句会导致MERGE子句认为CREATE vs MATCH正在发生

我意识到这是WITH子句的一个奇怪用法,但它确实似乎可以绕过操纵标签的限制。塞弗认为这是有效的塞弗。我假设这只是一个bug和一个边缘案例,但我想在报告之前获得其他见解和可能的替代方案

我意识到我本可以创建一个事务,并在该事务中作为单独的查询发出匹配和合并,但有一些原因表明,这在我正在编写的API的设计中不能很好地工作


谢谢

我不明白为什么您的查询不起作用,但@frobberoffits提出的问题是有效的

但是,从逻辑上讲,您的示例查询相当于以下查询:

  MATCH (m {name:'Brian'}) 
  REMOVE m:l1:l2
  SET m={mprops}
  RETURN m

此查询更简单,完全避免使用MERGE,并且可以避免您看到的任何问题。这是否代表了你想要做的事情

我不明白为什么您的查询不起作用,但@frobberoffits提出的问题是有效的

但是,从逻辑上讲,您的示例查询相当于以下查询:

  MATCH (m {name:'Brian'}) 
  REMOVE m:l1:l2
  SET m={mprops}
  RETURN m

此查询更简单,完全避免使用MERGE,并且可以避免您看到的任何问题。这是否代表了你想要做的事情

如果使用MATCH作为查询的前缀,那么如果没有现有的“Brian”节点,它将永远不会执行

您还可以使用集合n={param}覆盖所有属性。您应该使用集合n+={param}


如果使用MATCH作为查询的前缀,那么如果没有现有的“Brian”节点,它将永远不会执行

您还可以使用集合n={param}覆盖所有属性。您应该使用集合n+={param}


试图理解这个查询,我认为缺少了一些东西,特别是为什么在下面的合并中没有使用m from和m?我假设MPROP和CPROP作为变量绑定传入?从您的设置和描述中,我真的不知道为什么您要将此作为一个查询而不是两个查询。第二个查询似乎在任何方面都不依赖于第一个查询,但您指出第一个查询正在搞乱第二个查询。什么API设计问题阻止您发出多个查询?此外,在您的示例中,只有在匹配成功时才会执行合并,因此这应该是一个等价的查询:MATCH m{name:'Brian'}REMOVE m:l1:l2 SET m={mprops}RETURN我已经根据我之前的评论添加了答案。我正在尝试添加创建或更新逻辑,作为我正在编写的Cypher的包装器API的一部分。createOrUpdate方法希望设置新节点的状态或更新包含标签的现有节点的状态。因此,我需要一种方法来删除所有标签,以便合并可以用新标签替换它们。匹配查询的唯一目的是删除标签。这就是合并查询不使用“m”绑定的原因。我不知道只有在匹配成功的情况下才会执行合并,所以这无论如何都不起作用。出于明显的性能原因,我不想发出需要多个REST请求的多个查询。我不想使用REST事务端点包含多个查询,因为我的包装器API提供了创建事务并在该事务中包含多个包装器API查询的选项。如果createOrUpdate方法本身创建了一个事务,则这不起作用。这就是为什么我一直在努力寻找一种方法来更新单个密码查询中节点的状态
hing缺失,特别是为什么在下面的合并中没有使用m from和m?我假设MPROP和CPROP作为变量绑定传入?从您的设置和描述中,我真的不知道为什么您要将此作为一个查询而不是两个查询。第二个查询似乎在任何方面都不依赖于第一个查询,但您指出第一个查询正在搞乱第二个查询。什么API设计问题阻止您发出多个查询?此外,在您的示例中,只有在匹配成功时才会执行合并,因此这应该是一个等价的查询:MATCH m{name:'Brian'}REMOVE m:l1:l2 SET m={mprops}RETURN我已经根据我之前的评论添加了答案。我正在尝试添加创建或更新逻辑,作为我正在编写的Cypher的包装器API的一部分。createOrUpdate方法希望设置新节点的状态或更新包含标签的现有节点的状态。因此,我需要一种方法来删除所有标签,以便合并可以用新标签替换它们。匹配查询的唯一目的是删除标签。这就是合并查询不使用“m”绑定的原因。我不知道只有在匹配成功的情况下才会执行合并,所以这无论如何都不起作用。出于明显的性能原因,我不想发出需要多个REST请求的多个查询。我不想使用REST事务端点包含多个查询,因为我的包装器API提供了创建事务并在该事务中包含多个包装器API查询的选项。如果createOrUpdate方法本身创建了一个事务,则这不起作用。这就是为什么我一直在努力寻找一种方法来在一个Cypher查询中更新节点的状态。在我的包装器API中,所有节点都有唯一的IDs GUID。可以在节点的内存表示形式上调用Node.save。如果节点没有GUID,那么我只需要创建一个。如果节点确实具有GUID,则它可能是对现有节点的更新,也可能是以前导出的节点的导入。在这种情况下,我需要发出一个查询来确定具有该GUID的节点是否存在,或者使用MERGE的ON MATCH/CREATE功能更好地继续此功能对于属性很好,但对于标签则不行。在我的查询和@cybersam中,您可以看到,您可以在集合为m={mprops}的节点上设置一组显式属性,但对于标签,您不能这样做。如果节点m具有label1,则执行设置m:label2:label3将导致节点具有标签label1、label2、label3。伊姆霍,这是塞弗应该解决的问题。在那之前,我一直在努力寻找一个有效的解决方法。这个方法实现了逻辑的更新部分,但没有实现创建。在我的包装器API中,所有节点都有唯一的IDs GUID。可以在节点的内存表示形式上调用Node.save。如果节点没有GUID,那么我只需要创建一个。如果节点确实具有GUID,则它可能是对现有节点的更新,也可能是以前导出的节点的导入。在这种情况下,我需要发出一个查询来确定具有该GUID的节点是否存在,或者使用MERGE的ON MATCH/CREATE功能更好地继续此功能对于属性很好,但对于标签则不行。在我的查询和@cybersam中,您可以看到,您可以在集合为m={mprops}的节点上设置一组显式属性,但对于标签,您不能这样做。如果节点m具有label1,则执行设置m:label2:label3将导致节点具有标签label1、label2、label3。伊姆霍,这是塞弗应该解决的问题。在那之前,我一直在努力寻找一个有效的解决办法