Neo4j 根据条件统计子节点

标签 neo4j cypher

在满足第一个条件之前,我需要对所有子节点进行计数。

例如我有这样的数据

-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/

相关文章:

java - 检索每个文档 Neo4j Lucene 的分数,而不仅仅是顺序

java - 使用 Cypher Neo4j 通过(在 SQL 世界中从表名中选择 *)获取具有给定类型的所有节点

Neo4j 密码 : find first matching relationship in a linked list?

neo4j - 如何将边/关系与包含该边信息的节点相关联?

neo4j - 您如何注销Neo4j Web管理控制台

java - 如何在 Java 中将 LinkedHashSet 转换为 EnumSet?

Neo4j Cypher,仅返回指定关系

Neo4j/Cypher Delete with Where "Unknown identifier"

mysql - Neo4j 替代 mysql View

java - Neo4j "WHERE"中类型比较的问题