我有一个匹配项,返回结果“ con”。然后,我想尝试通过可选地与其他模式相交来优化结果。如果它们是辅助图案上的交点,则应返回这些结果,否则应原样返回原始结果。
我的问题是,当没有交集时,“ con”结果变为null,因此我无法将它们作为替代返回。在我的许多查询中,这对我来说是一场持续的战斗。在没有匹配项的情况下使集合相交而不丢失的一种好方法是什么?
MATCH p0=(:node {name:”Sam”})-[:has*1]->(s0:friend)-[:sub*0..35]->(con)
MATCH p1=(:node {name:”Toby”})-[:has*1]->(s1:friend)-[:sub*0..35]->(con)
OPTIONAL MATCH (s0)-[:inst*1]-(a:ins)-[:inst*1]->(b:ins)<-[:inst*1]-(s1)
OPTIONAL MATCH (b)-[:inst|sub*0..40]->(c)
WITH apoc.coll.intersection(collect(distinct con),collect(distinct c)) as results,con
UNWIND results as co
RETURN DISTINCT
CASE WHEN co IS NULL THEN con ELSE co END AS res
我已经分别返回“ con”作为测试,并且在存在“ co”的地方仍然存在“ con”,但是当“ co”为null时,“ con”也是如此。
感谢您的帮助!
答案 0 :(得分:1)
这里的问题是您的UNWIND。 UNWIND就像取每个列表元素与列表的每一行的叉积,因此,如果列表为空,则该列表的行将被清除。
我们在section in the documentation中添加了有关如何在UNWIND期间使用CASE来使用非空列表的方法。
应用于您的查询的外观如下:
MATCH p0=(:node {name:"Sam"})-[:has*1]->(s0:friend)-[:sub*0..35]->(con)
OPTIONAL MATCH (s0)-[:inst*1]-(a:ins)-[:inst*1]->(b:ins)<-[:inst*1]-(s1)
OPTIONAL MATCH (b)-[:inst|sub*0..40]->(c)
WITH apoc.coll.intersection(collect(distinct con),collect(distinct c)) as results,con
UNWIND CASE WHEN size(results) = 0 THEN [null] ELSE results END as co
RETURN DISTINCT
CASE WHEN co IS NULL THEN con ELSE co END AS res
答案 1 :(得分:0)
由于没有我自己的智慧,我找到了解决方案。在这种使用情况下,c
将始终是con
的子集,这意味着如果c
中有任何结果,则c
和con
的交集将始终返回结果。这使我可以使用c
的大小来确定是返回con
还是作为最后一个操作预成型apoc.coll.intersection()
并返回con
和c
的交集
MATCH p0=(:node {name:”Sam”})-[:has*1]->(s0:friend)-[:sub*0..35]->(con)
MATCH p1=(:node {name:”Toby”})-[:has*1]->(s1:friend)-[:sub*0..35]->(con)
OPTIONAL MATCH (s0)-[:inst*1]-(a:ins)-[:inst*1]->(b:ins)<-[:inst*1]-(s1)
OPTIONAL MATCH (b)-[:inst|sub*0..40]->(c)
RETURN DISTINCT CASE WHEN size(collect(c)) = 0 THEN collect(con) ELSE apoc.coll.intersection(collect(distinct con),collect(distinct c)) END as co LIMIT 50
我必须在collect(con)
中使用RETURN
,以便将其以与co
相同的形式返回以进行后期处理。我可能会通过反复试验发现一些更简单的方法。