将变量值保留到密码查询的其他部分

时间:2018-12-13 20:23:49

标签: neo4j cypher cypher-3.1

我的查询出现问题,因为FOREACH子句中定义的变量不可用于后续的MERGE。在下面的代码段中,我在创建节点之前检查每个字段的值是否存在。在某些情况下,这些字段可能会丢失,因此我不想为其创建节点。 然后在最后的FOREACH中,假设对这些节点的引用存储在变量中,我尝试创建它们之间的关系。

FOREACH(ignoreMe IN CASE WHEN "${record:value('/11')}" <> "" THEN [1] ELSE [] END |
  MERGE (company:Company{name:"${record:value('/11')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/1')}" <> "" THEN [1] ELSE [] END |
  MERGE (cloudSuite:CloudSuite{name:"${record:value('/1')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/18')}" <> "" THEN [1] ELSE [] END |
  MERGE (application:Application{name:"${record:value('/18')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/8')}" <> "" THEN [1] ELSE [] END |
  MERGE (applicationInstance:ApplicationInstance{applicationId:"${record:value('/8')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/9')}" <> "" THEN [1] ELSE [] END |
  MERGE (screen:Screen{name:"${record:value('/9')}"}))

FOREACH(ignoreMe IN CASE WHEN "${record:value('/19')}" <> "" THEN [1] ELSE [] END |
  MERGE (screenInstance:ScreenInstance{screenId:"${record:value('/19')}"}))

FOREACH(ignoreMe IN CASE WHEN ("${record:value('/0')}" IN ["Accessed"])THEN [1] ELSE [] END |
    MERGE (screenInstance)-[:INSTANCE_OF]->(screen)
    MERGE (screenInstance)-[:VIEWED_ON]->(applicationInstance)
    MERGE (application)-[:IMPLEMENTS]->(screen)
    MERGE (session)-[:ACCESSES]->(screenInstance))

但是实际上发生的是,当我可视化图形时,我看到了定义为孤立节点的有效节点以及在某些“虚拟”节点之间创建的关系。 所以我的问题是,是否有办法将对有效节点的引用传递给创建关系的MERGE。

1 个答案:

答案 0 :(得分:1)

您将无法使用此方法,因为您发现FOREACH中引入的变量将无法使用。

您可能想看看使用APOC conditional procedures(使用apoc.do.when()进程)来代替FOREACH解决方法。您可以从执行的Cypher返回通过生成的value映射变量公开的值。

例如,仅查看第一个片段:

CALL apoc.do.when("${record:value('/11')}" <> "", 
"MERGE (company:Company{name:\"${record:value('/11')}\"}) RETURN company") YIELD value
WITH value.company as company
...

请记住,如果条件内的查询需要使用条件外的变量,则需要通过参数映射将其传入。