Neo4J Bolt Driver Record在COLLECT match上包含重复的整体



我的数据库包含:

  • 1 Game (g)
  • 2扩展(e)
  • 2类(c)

在浏览器客户端执行下面的查询时,我得到了我所期望的结果。但是,使用Java螺栓驱动程序,我得到了奇怪的结果。

final var query = """
MATCH (g:Game {name:$name})-[:HAS]->(e:Game),
(g)-[:HAS]->(c:Category)
RETURN DISTINCT g, 
COLLECT(e) AS expansions,
COLLECT(c) AS categories
""";
try (var session = driver.session()) {
return session.readTransaction(tx -> {
final var result = tx.run(query, parameters("name", name));
final var maybeGame = result.stream().findFirst();
if (maybeGame.isPresent()) {
final var gameRecord = maybeGame.get();
final var gameMap = gameRecord.get("g").asMap();
final var expansionMaps = gameRecord.get("expansions").asList(MapAccessor::asMap);
final var categoryMaps = gameRecord.get("categories").asList(MapAccessor::asMap);
return Optional.of(Game.convert(gameMap, expansionMaps));
}
return Optional.empty();
});
}

gameMap包含一个游戏。expansionsMap包含4,重复了我期望的2。categoriesMap同;结果是4,2应该是重复的

我显然可以在我的转换器中解析出来,但我不明白为什么我没有得到正确数量的映射。有什么我可以调整查询,或代码?

您的查询不正确。

它的工作在您的Neo4j浏览器可能在图形视图(因为可视化不显示相同的节点两次),切换到表视图或文本视图,以查看您的查询有4个结果的扩展和类别。

获取存根数据

MERGE (g:Game {id: 1})
MERGE (e1:Game {id: 2})
MERGE (e2:Game {id: 3})
MERGE (c1:Category {id: 4})
MERGE (c2:Category {id: 5})
MERGE (g)-[:HAS]->(e1)
MERGE (g)-[:HAS]->(e2)
MERGE (g)-[:HAS]->(c1)
MERGE (g)-[:HAS]->(c2)
MATCH (g:Game {id: 1})-[:HAS]->(e:Game),
(g)-[:HAS]->(c:Category)
RETURN DISTINCT g, 
COLLECT(e) AS expansions,
COLLECT(c) AS categories
╒════════╤═════════════════════════════════════╤═════════════════════════════════════╕
│"g"     │"expansions"                         │"categories"                         │
╞════════╪═════════════════════════════════════╪═════════════════════════════════════╡
│{"id":1}│[{"id":3},{"id":2},{"id":3},{"id":2}]│[{"id":5},{"id":5},{"id":4},{"id":4}]│
└────────┴─────────────────────────────────────┴─────────────────────────────────────┘

修改查询使其正常工作

MATCH (g:Game {id: 1})-[:HAS]->(e:Game),
(g)-[:HAS]->(c:Category)
RETURN g, 
COLLECT(distinct e) AS expansions,
COLLECT(distinct c) AS categories
╒════════╤═══════════════════╤═══════════════════╕
│"g"     │"expansions"       │"categories"       │
╞════════╪═══════════════════╪═══════════════════╡
│{"id":1}│[{"id":3},{"id":2}]│[{"id":5},{"id":4}]│
└────────┴───────────────────┴───────────────────┘

小说明,g不需要distinct,因为它是一个非聚合函数,因此将用作隐式groupBy

https://neo4j.com/docs/cypher-manual/current/functions/aggregating/

最新更新