Java查询Neo4j特定路径后获取完整结果的问题求助
问题分析与解决方案
首先得明确你遇到问题的核心原因:Neo4j Java API 里的 Result 对象是流式迭代的,只能从头到尾遍历一次。当你第一次遍历 o_column 时,已经把整个结果集的指针移到了末尾,这时候再去获取 p_column 的迭代器,自然就没有数据可以返回了,所以产品数量显示为0。
你完全不需要重复执行5次查询,一次查询就能拿到所有需要的节点和关系数据,关键是要正确遍历结果集,一次性提取每行里的所有内容。
正确的实现方式
你应该遍历结果集中的每一行,从每行里同时取出 o、p、cate 三个节点,还能顺便把数据保存到集合里供后续使用。修改后的代码示例如下:
String query = "MATCH (o:Order)-[:ORDERS]->(p:Product)-[:PART_OF]->(cate:Category) RETURN o,p,cate"; try( Transaction tx = db.beginTx(); Result result = db.execute(query) ){ // 用集合保存所有节点,方便后续业务使用 List<Node> orders = new ArrayList<>(); List<Node> products = new ArrayList<>(); List<Node> categories = new ArrayList<>(); while (result.hasNext()) { Map<String, Object> row = result.next(); Node order = (Node) row.get("o"); Node product = (Node) row.get("p"); Node category = (Node) row.get("cate"); orders.add(order); products.add(product); categories.add(category); } System.out.println("number of orders: " + orders.size()); System.out.println("number of products: " + products.size()); System.out.println("number of categories: " + categories.size()); tx.success(); }
额外补充:获取关系数据
如果还需要获取路径里的 ORDERS 和 PART_OF 关系,只需要修改查询语句把关系也返回,之后在遍历行时同步提取即可:
MATCH (o:Order)-[r1:ORDERS]->(p:Product)-[r2:PART_OF]->(cate:Category) RETURN o, r1, p, r2, cate
对应的代码里可以新增两个集合保存关系:
List<Relationship> orderRelations = new ArrayList<>(); List<Relationship> partOfRelations = new ArrayList<>(); // 在循环里添加 Relationship r1 = (Relationship) row.get("r1"); Relationship r2 = (Relationship) row.get("r2"); orderRelations.add(r1); partOfRelations.add(r2);
这种方式只需要执行一次查询,就能把所有需要的节点和关系都提取出来,既高效又避免了重复查询的性能损耗。
内容的提问来源于stack exchange,提问作者Bao Nguyen
相关产品推荐
相关产品推荐

