Neo4j Apoc Case When 在 java 中获取结果摘要

Neo4j Apoc Case When get result summary in java

嘿,我目前正在编写一个 Java 应用程序,它通过 Spring Neo4J 驱动程序访问 NEO4J。 我有几个带有数组的节点。不,我正在尝试编写一个密码查询,从匹配节点的数组中删除一个元素。如果该元素是最后一个元素,我很想删除完整的节点。为了实现这一点,我使用 apoc.do.when。您可以在下面找到我的查询的简化版本。

MATCH (n:NODE)  WHERE "Peter" IN n.NAMES
CALL apoc.do.when(size(n.NAMES) > 1, 'SET n.NAMES = [x IN n.NAMES WHERE x <> "Peter"]', 'DETACH DELETE n') YIELD value
RETURN value

我的查询总体上运行良好,但我的 Java 应用程序中不再返回结果摘要。 我通过以下方式调用查询:

ResultSummary output = driver.session().run(query.withParameters(params)).consume();

我知道查询已执行并删除了一个节点。我通过 Neo4J 浏览器验证了这一点,但结果摘要显示:

serverInfo=InternalServerInfo{address='localhost:7687', version='Neo4j/3.5.17'}, databaseInfo=InternalDatabaseInfo{name='null'}, queryType=READ_WRITE, counters=null, plan=null, profile=null, notifications=[], resultAvailableAfter=143, resultConsumedAfter=1}
Updates: 0
Delete: 0

因此,如果操作成功,我无法通过我的 Java 代码进行验证。我假设 apoc.do.when 不会正确地提升查询的结果摘要。无论如何要解决这个问题还是我需要用第二个查询来验证这个问题?

您可以将 Cypher 查询修改为 return 指示是否发生更新或删除的结果。例如:

MATCH (n:NODE) WHERE "Peter" IN n.NAMES
CALL apoc.do.when(
  size(n.NAMES) > 1,
  'SET n.NAMES = [x IN n.NAMES WHERE x <> "Peter"] RETURN "updated" AS res',
  'DETACH DELETE n RETURN "deleted" AS res') YIELD value
RETURN value.res AS res

然后您的 Java 客户端可以遍历(或流式传输)生成的记录并计算更新和删除的次数。