我想返回union语句的计数,但是我的return语句有点麻烦。 给出一个维恩图,联合是"区域的总和"两个圆圈减去它们之间的交点。我试图效仿这一点,但我遇到了一点麻烦,因为布尔人没有转换为整体。
我试图回复这样的事情:
COUNT(DISTINCT a.name) + COUNT(DISTINCT b.name) - (a.name == b.name)
答案 0 :(得分:1)
您可以执行CASE WHEN a.name = b.name THEN 1 ELSE 0 END
(并对此进行总结或其他内容)。但是,如果您对其他两个进行区分,则可能会有重复 - 如果您可以向我们提供更多详细信息,则可能需要在查询的其余部分进行调整以避免重复。
答案 1 :(得分:0)
如果我们假设您的原始查询看起来像neo4j 2.1.5 cheat sheet中的第一个UNION示例:
MATCH (a)-[:KNOWS]->(b)
RETURN b.name
UNION
MATCH (a)-[:LOVES]->(b)
RETURN b.name
然后你可以这样得到UNION中不同名字的数量:
OPTIONAL MATCH (a)-[:KNOWS]->(b)
WITH COLLECT(DISTINCT b.name) AS n1
OPTIONAL MATCH (c)-[:LOVES]->(d)
WITH COLLECT(DISTINCT d.name) AS n2, n1
RETURN LENGTH(filter(x IN n2 WHERE NOT (x IN n1))) + LENGTH(n1)
我没有看到使用实际UNION语句计算答案的方法。
答案 2 :(得分:0)
这可能比您计划编写的更加密集,但我最近处于类似情况,最后我将集合和交集放在集合中,并找出产生的差异。
我确信有更好的方法,但这就是我提出的方法。基本上,我找到了set 1和set 2并将它们分别放在一个集合中。然后我通过找到所有相同的东西找到了交叉点,并将它们放在另一个叫做交集的集合中。然后我只是将每个set1和set2过滤掉了。最后,我留下了两组包含交叉点之外的节点。
match (things_in_set_1)
where <things in set 1 criteria>
with collect(things_in_set_1.name) as set1
match (things_in_set_2)
where <things in set 2 criteria>
with collect(things_in_set_2.name) as set2, set1
optional match (things_in_set_1),(things_in_set_2)
where things_in_set_1.name = things_in_set_2.name
with collect(things_in_set_1.name) as intersection, set1, set2
with filter( id IN set1 WHERE not(id in(intersection)) ) as set_unique_nodes1, set2, intersection
with filter( id IN set2 WHERE not(id in(intersection)) ) as set_unique_nodes2, set_unique_nodes1
return length(set_unique_nodes2) + length(set_unique_nodes1)