【发布时间】:2018-02-15 22:49:27
【问题描述】:
在 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 运行上述查询两次,我预计两个 EVENT 与 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
【问题讨论】:
-
听起来很有用,但也有一些复杂性。我们可以轻松地从此过程返回结果,因为结果只会执行一个查询。为了支持执行多个查询,我们可能必须将所有查询限制为只写。
-
是的,我同意。在我的特殊情况下,所有查询都是只写查询。
-
这可行。您可以将此请求的问题添加到 APOC GitHub 吗?
-
在 apoc github github.com/neo4j-contrib/neo4j-apoc-procedures/issues/742创建问题
标签: neo4j cypher neo4j-apoc