如何在WHERE子句中向(弱)连接的组件查询添加元素条件?

时间:2019-01-25 16:18:00

标签: neo4j cypher

我想在cypher中找到一个查询,该查询返回图形中的(弱)连接的组件,其中包含20到30个元素,并且至少包含10个元素,其属性为“ prop” = True。

CALL algo.unionFind.stream('User', 'RELATED_WITH', {})
YIELD nodeId,setId
WITH setId,count(*) AS size,algo.getNodeById(nodeId) AS node
WHERE size >= 20 AND size <= 30 AND ???
RETURN node.id,setId

代码几乎完成了我要查找的内容,也就是说,它查找了(弱)20到30个元素之间的连接组件,但是我不知道如何在WHERE子句中引入节点的条件(或任何地方)(看看???符号)。

1 个答案:

答案 0 :(得分:1)

您遇到的问题之一是count(*)始终为1,因为您也在按每个节点进行聚合。请记住,Neo4j隐含了分组,它将按行中的所有元素分组。

一个简单的prop=True语句即可通过sum(CASE WHEN ...)获得节点数

解决方案:

CALL algo.unionFind.stream('User', 'RELATED_WITH', {})
YIELD nodeId,setId
WITH setId,algo.getNodeById(nodeId) AS node
WITH setId,count(*) as size, 
           collect(node) as nodes,
           sum(CASE WHEN node.prop = True THEN 1 ELSE 0) END as prop_true_count
WHERE size >= 20 AND size <= 30 AND prop_true_count >= 10
UNWIND nodes as n
RETURN n.id,setId