Neo4j根据条件计运算符节点

我需要计算所有子节点,直到第一个条件满足.

例如我有像这样的数据

-MainParent
   -ParentChild 1
       -Child 1
       -Child 2   
   -ParentChild 2
       -Child 1
       -Child 2
       -Child 3
          -grand child 1
          -grand child 2

它会给我节点总数= 10.但是假设我阻止了Child 3,那么来自Child 3的所有孩子都不应该被计算.

这是我的查询 –

MATCH (m:MainParent)-[c:HAS_COMMENT*]-(child)
WHERE child.blocked <> 1
return count(child) as child_count

现在它会给我child_count = 9.
但我需要它到7,
匹配第一个条件后,即child.blocked<>应忽略1个进一步的计数.

谢谢.
请告诉我是否需要详细说明.

最佳答案 如果每条评论只有一条路径,那么您可以使用以下内容:

MATCH path =(m:MainParent)-[c:HAS_COMMENT*0..]-(child)
WITH path
WHERE ALL (node IN TAIL(NODES(path)) 
       WHERE node.blocked = FALSE )
RETURN COUNT(path)

匹配零长度路径的[c:HAS_COMMENT * 0 ..]是因为我认为您也想要计算MainParent节点.

WHERE ALL要求嵌套查询对集合中的所有元素都为true,这意味着如果路径中的单个节点被标记为已阻塞,则该路径将不匹配.

使用TAIL(NODES(路径))是因为头节点始终是MainParent节点,它永远不会匹配node.blocked约束.

如果您需要节点(这是未经测试的,但沿着这些线路):

MATCH path =(m:MainParent)-[c:HAS_COMMENT*0..]-(child)
WITH path
WHERE ALL (node IN TAIL(NODES(path)) 
       WHERE node.blocked = FALSE )
WITH NODES(path) AS nodes
UNWIND nodes as node
RETURN DISTINCT node

替代
如果这对您不起作用,或者有点过于复杂,我想知道您是否考虑过允许模型为您完成工作

如果不是将注释标记为已阻止,则将两个选项之间的关系标记为已阻止,这两个选项中的一个将起作用.

您可以通过将被阻止的属性移动到关系来实现此目的:

(c:Comment)-[:HAS_COMMENT{blocked:true}]-(cc:Comment)

启用:

MATCH (m:MainParent)-[c:HAS_COMMENT*]-(child)
WHERE c.blocked <> 1
RETURN count(child) as child_count

或者通过将关系类型更改为BLOCKED_COMMENT:

(c:Comment)-[:HAS_BLOCKED_COMMENT]-(cc:Comment)    

启用:

MATCH (m:MainParent)-[c:HAS_COMMENT*]-(child)
RETURN count(child) as child_count
点赞