如何在Neo4j密码查询中使用模式理解对关系大小进行条件检查



使用以下查询,我能够根据关系计数生成条件查询语句。

WITH ( (:LABEL_X)<-[]-(:LABEL_Y) ) AS res
CALL apoc.do.when(size( res ) = 2,
"MATCH (c:LABEL_Y)  RETURN c",
"MATCH (mu:LABEL_X)<-[mr]-(c:LABEL_Y) RETURN mu,mr,c",
{res:res}) YIELD value
RETURN value

然而,这显示警告皮棉低于

此功能已被弃用,并将在未来版本中删除。

模式表达式只能用于测试模式的存在。因此,它只能在上下文中使用计算为布尔值,例如在函数exists((内部或WHERE子句。所有其他用途都已弃用,应替换为模式理解。

所以,请建议一种使用模式理解来获得相同结果的方法。从neo4j文档的模式理解中,我发现大部分内容都在RETURN语句中。而在我的情况下,我需要在执行apoc之前执行它,以便决定在apoc.do.when调用中执行什么查询。

或者,如果你知道其他实现这一目标的方法,也可以提出建议。

您可以这样使用它:

WITH [x = (:LABEL_X)<-[]-(:LABEL_Y) | x] AS res
CALL apoc.do.when(size( res ) = 2,
"MATCH (c:LABEL_Y)  RETURN c",
"MATCH (mu:LABEL_X)<-[mr]-(c:LABEL_Y) RETURN mu,mr,c",
{res:res}) YIELD value
RETURN value

或者直接计算大小,如下所示:

WITH size([x = (:LABEL_X)<-[]-(:LABEL_Y) | x]) AS numberOfPaths
CALL apoc.do.when( numberOfPaths  = 2,
"MATCH (c:LABEL_Y)  RETURN c",
"MATCH (mu:LABEL_X)<-[mr]-(c:LABEL_Y) RETURN mu,mr,c",
{numberOfPaths:numberOfPaths}) YIELD value
RETURN value

您正在计算(通过大小(LABEL_X和LABEL_Y之间的关系数。如果大小等于2,那么您将返回LABEL_Y,否则您将返回LABEL_X、LABEL_Y及其关系。

这个表达式:

size((:LABEL_X)<-[]-(:LABEL_Y)) 

与相同

MATCH res=(:Price_Point)-[]-(:Headphone)  
WITH size(collect(relationships(res))) as res 

因此,下面的查询将避免关于模式表达式的弃用的警告错误

MATCH res=(:LABEL_X)<-[]-(:LABEL_Y)
WITH size(collect(relationships(res))) as res
CALL apoc.do.when(
res = 2,
"MATCH (c:LABEL_Y)  RETURN c",
"MATCH (mu:LABEL_X)<-[mr]-(c:LABEL_Y) RETURN mu, mr, c",
{}
) YIELD value
RETURN value

请注意,我删除了param{res:res},因为它没有被使用。参数是一个映射,而在查询中res是一个模式表达式,它是一个列表列表。