我需要计算所有子节点,直到第一个条件满足.
例如我有像这样的数据
-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