Neo4j/Cypher-基于count的条件set/create/etc语句(或任何以前的查询语句)

Neo4j/Cypher-基于count的条件set/create/etc语句(或任何以前的查询语句),neo4j,cypher,Neo4j,Cypher,如何根据前一行的结果有条件地进行设置(或其他操作)?例如,下面的查询(不适用于atm),我试图根据计数是否为1来更新某些内容(否则不进行更新)。查询不喜欢其后的语句,因此这就是发生错误的地方。我也尝试过使用WHERE子句,但到目前为止还没有成功 有没有其他方法可以在一个查询中完成我下面要做的事情 MATCH (n:Thing { name: 'asdf' }) OPTIONAL MATCH (p:Thing)-[:HAS_CHILD]->(n) OPTIONAL MATCH (c)<

如何根据前一行的结果有条件地进行设置(或其他操作)?例如,下面的查询(不适用于atm),我试图根据计数是否为1来更新某些内容(否则不进行更新)。查询不喜欢其后的语句,因此这就是发生错误的地方。我也尝试过使用WHERE子句,但到目前为止还没有成功

有没有其他方法可以在一个查询中完成我下面要做的事情

MATCH (n:Thing { name: 'asdf' })
OPTIONAL MATCH (p:Thing)-[:HAS_CHILD]->(n)
OPTIONAL MATCH (c)<-[:HAS_CHILD]-(p:Thing)
WITH c, p, n,
CASE count(c)
WHEN 1
THEN SET p.btogstate = 'closed'
DETACH DELETE n
MATCH(n:Thing{name:'asdf'})
可选匹配(p:Thing)-[:HAS\u CHILD]->(n)
可选匹配(c)(n)
可选匹配(c)(n)
用p,n
可选匹配(p)-[:HAS_CHILD]->(y)
纽约哪里
用n,y,p,
当y为空时,则[1]else[]结束为countOne
FOREACH(countOne中的x | SET p.btogstate='closed')
分离删除n;
试试这个:

MATCH (n:Thing { name: 'asdf' })
OPTIONAL MATCH (p:Thing)-[:HAS_CHILD]->(n)
OPTIONAL MATCH (c)<-[:HAS_CHILD]-(p:Thing)
WITH c, p, n
FOREACH(x IN (CASE WHEN c IS NULL THEN [] else [1] END) |
  DETACH DELETE n
)
MATCH(n:Thing{name:'asdf'})
可选匹配(p:Thing)-[:HAS\u CHILD]->(n)
可选匹配(c)这应该有效:

MATCH (n:Thing { name: 'asdf' })
OPTIONAL MATCH (c)<-[:HAS_CHILD]-(p:Thing)-[:HAS_CHILD]->(n)
WITH p, n,
  CASE WHEN COUNT(c) = 1 then [1] else [] end as countOne
FOREACH (x in countOne | SET p.btogstate = 'closed')
DETACH DELETE n;
MATCH(n:Thing{name:'asdf'})
可选匹配(c)(n)
用p,n,
当COUNT(c)=1时,则[1]else[]结束为countOne
FOREACH(countOne中的x | SET p.btogstate='closed')
分离删除n;

请注意,与原始查询不同,
WITH
子句本身不包含
c
,因为这会阻止聚合函数
COUNT
按预期工作(在这种情况下,如果可选匹配找到任何匹配项,则COUNT的值始终为1).

是否确实要分离删除n
(即,删除
n
及其所有关系)--不管怎样?@cybersam yep,n需要完全消失,但与它有[:HAS_CHILD]关系的节点需要更新属性(btogstate),因为它已被删除,既然这个属性只有一个特定的值,如果它也有一个子(n),那么你真的需要1
c
才能设置这个属性吗?@cybersam yep,如果它大于1,那么我就不想设置这个属性了。非常感谢!但由于某些原因,它在我的代码中不起作用。我必须调查原因。我在回答中又加了一句话。这可能会有所帮助。我认为这是可行的,但在进一步检查后,属性(p.btogstate)没有得到设置,即使只是进行计数的查询确实为我返回1Works。我首先运行这个查询:
CREATE(n:Thing{name:'asdf'}),(c)(n)
,然后运行我的答案。已删除
n
节点,
p
节点具有预期的新属性。您的数据模型与问题中提出的不同吗?我刚刚尝试了您的创建和解决方案,它成功了,所以我将标记为已解决。但两者之间真的没有区别(我疲惫的眼睛无论如何都能发现)。加上我对count的一些查询,我决定有时工作,有时不工作。我不知道…我不知道我的数据库是否有问题。像往常一样感谢您的帮助:)
MATCH (n:Thing { name: 'asdf' })
OPTIONAL MATCH (p:Thing)-[:HAS_CHILD]->(n)
OPTIONAL MATCH (c)<-[:HAS_CHILD]-(p:Thing)
WITH c, p, n
FOREACH(x IN (CASE WHEN c IS NULL THEN [] else [1] END) |
  DETACH DELETE n
)
MATCH (n:Thing { name: 'asdf' })
OPTIONAL MATCH (c)<-[:HAS_CHILD]-(p:Thing)-[:HAS_CHILD]->(n)
WITH p, n,
  CASE WHEN COUNT(c) = 1 then [1] else [] end as countOne
FOREACH (x in countOne | SET p.btogstate = 'closed')
DETACH DELETE n;