0

在 cypher 或 APOC 中,有没有办法根据多个条件执行多个查询。我需要类似这个 APOC 的东西

CALL apoc.do.case([condition, query, condition, query, …​], elseQuery:'', 
params:{}) yield value

但是在这里,一旦我们遇到第一个真实条件,它就会跳过所有进一步的条件和查询。我想在我的条件为真的情况下执行所有那些查询。

简而言之,我正在寻找类似于 java case 语句的东西(没有中断;在 case 之间)

更新

我运行以下查询以使用多个 apoc.do.when 但似乎只有我的第二个 apoc.do.when 没有执行:

CREATE (y:EVENT { _id: 1, localComponentID:'l1', externalComponentID:'e1'}) with y 

call apoc.do.when(exists(y.localComponentID),"MATCH(e:EVENT) where 
e.localComponentID = lcl and e._id <> y._id with  y,e limit 1 create (y)-
[r:LOCAL_LINK]->(e)",'',{y:y,lcl:y.localComponentID}) YIELD value WITH value AS ignored, y

call apoc.do.when(exists(y.externalComponentID),"MATCH(e:EVENT) where 
e.externalComponentID = ext and e._id <> y._id with  y,e limit 1 create (y)-
[r:EXTERNAL_LINK]->(e)",'',{y:y, ext:y.externalComponentID}) YIELD value 
WITH value AS ignored return ignored

如果我在第一次运行时使用 _id = 1 并在第二次运行时使用 _id=2 运行上述查询两次,我希望两个事件与 LOCAL_LINK 和 EXTERNAL_LINK 连接。但我只在他们之间获得 LOCAL_LINK,而不是 EXTERNAL_LINK。我不确定我做错了什么。

注意:我使用限制 1,因为在多个匹配的情况下,我只想用一个节点创建 LINK。

更新 2

得到它的工作,在我的示例查询中,我没有从第一个apoc.do.when返回 y

这是有效的更新查询:

CREATE (y:EVENT { _id: 1, localComponentID:'l1', externalComponentID:'e1'}) with y 

call apoc.do.when(exists(y.localComponentID),"MATCH(e:EVENT) where 
e.localComponentID = lcl and e._id <> y._id with  y,e limit 1 
create (y)-[r:LOCAL_LINK]->(e) RETURN y",'',
{y:y,lcl:y.localComponentID}) YIELD value WITH value AS ignored, y

call apoc.do.when(exists(y.externalComponentID),"MATCH(e:EVENT) where 
e.externalComponentID = ext and e._id <> y._id with  y,e limit 1 
create (y)-[r:EXTERNAL_LINK]->(e)",'',{y:y, ext:y.externalComponentID}) 
YIELD value 
WITH value AS ignored return ignored
4

1 回答 1

2

您可以为每个条件/查询对调用 APOC 函数apoc.do.when(以空字符串作为else参数)。

例如:

CALL apoc.do.when(<condition1>, <query1>, '', {}) YIELD value
WITH value AS ignored
CALL apoc.do.when(<condition2>, <query2>, '', {}) YIELD value
WITH value AS ignored
.
.
.

由于您的评论表明您的查询都是只写的,因此上面的示例将 return values 分配给一个ignored变量(您可以忽略该变量)。

于 2018-02-16T00:23:07.407 回答