在满足第一个条件之前,我需要对所有子节点进行计数。
例如我有这样的数据
-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 中的所有 child 都不应该被计算在内。
这是我的查询-
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
要求嵌套查询对集合中的所有元素都为真,这意味着如果路径中的单个节点被标记为阻塞,则该路径将不匹配。TAIL(NODES(path))
之所以使用,是因为头节点始终是 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
关于Neo4j 根据条件统计子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26355006/