Neo4j根据条件计算子节点

时间:2014-10-14 07:27:21

标签: neo4j cypher

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

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后,应忽略进一步计数。

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

3 个答案:

答案 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

它允许您决定如何遍历图表以及何时停止遍历。