我需要计算所有子节点,直到第一次条件满足。
e.g。我有像
这样的数据-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
后,应忽略进一步计数。
感谢。 请告诉我是否需要详细说明。
答案 0 :(得分:2)
如果每条评论只有一条路径,那么您可以使用以下内容:
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(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
答案 1 :(得分:0)
试试这个
MATCH path = (m:MainParent)-[c:HAS_COMMENT*]-(child)
WHERE child.blocked <> 1 and all(n in nodes(path) where child.blocked <> 1)
return count(distinct child) as child_count
答案 2 :(得分:0)
听起来像遍历api可能会对你的情况有所帮助。 http://docs.neo4j.org/chunked/stable/tutorial-traversal-concepts.html
它允许您决定如何遍历图表以及何时停止遍历。