我的数据库包含:
- 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/