将变量值保存到密码查询的其他部分
Persisting variable values to other parts of the cypher query
我的查询有问题,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))
然而,实际发生的情况是,当我可视化我的图表时,我看到有效节点被定义为孤立节点,并且在某些 "phantom" 节点之间创建了关系。
所以我的问题是,是否有办法将对有效节点的引用传递给创建关系的 MERGE。
您将无法使用此方法,因为您发现在 FOREACH 中引入的变量在其外部不可用。
您可能需要查看使用 APOC conditional procedures(使用 apoc.do.when()
过程)代替 FOREACH 解决方法。您可以 return 来自已执行的 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
...
请记住,如果条件内的查询需要使用条件外的变量,则需要通过参数映射将其传入。
我的查询有问题,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))
然而,实际发生的情况是,当我可视化我的图表时,我看到有效节点被定义为孤立节点,并且在某些 "phantom" 节点之间创建了关系。 所以我的问题是,是否有办法将对有效节点的引用传递给创建关系的 MERGE。
您将无法使用此方法,因为您发现在 FOREACH 中引入的变量在其外部不可用。
您可能需要查看使用 APOC conditional procedures(使用 apoc.do.when()
过程)代替 FOREACH 解决方法。您可以 return 来自已执行的 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
...
请记住,如果条件内的查询需要使用条件外的变量,则需要通过参数映射将其传入。