Neo4j将布尔值转换为Int

时间:2014-11-10 20:15:29

标签: neo4j

我想返回union语句的计数,但是我的return语句有点麻烦。 给出一个维恩图,联合是"区域的总和"两个圆圈减去它们之间的交点。我试图效仿这一点,但我遇到了一点麻烦,因为布尔人没有转换为整体。

我试图回复这样的事情:

COUNT(DISTINCT a.name) + COUNT(DISTINCT b.name) - (a.name == b.name)

3 个答案:

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