Neo4j 5.x 中正确使用图遍历与 Cypher 替代方案指南

neo4j 5.x 已弃用旧版嵌入式 traversal api(如 `findnode`、`traversaldescription`),需统一使用新版 `neo4j-graphdb-api` 并改用 cypher 查询替代手动遍历,避免编译错误与兼容性问题。

在 Neo4j 5.x 及以上版本中,您遇到的 Cannot resolve method 'findNode' in 'Transaction' 和 Cannot resolve method 'traversalDescription' in 'Transaction' 错误,根本原因在于:您混合使用了不兼容的驱动与嵌入式 API 版本,且误用了已彻底移除的旧版嵌入式遍历框架(Traversal Framework)

Neo4j 自 4.0 起已明确标记 org.neo4j.graphdb.traversal.* 相关 API 为 deprecated,并在 5.x 版本中完全移除。Transaction 接口不再提供 findNode() 或 traversalDescription() 方法——这些方法仅存在于本地嵌入式数据库(Embedded Neo4j) 的旧版 GraphDatabaseService 事务中,而您当前使用的是 Bolt 驱动(neo4j-java-driver),它面向远程服务器通信,本身就不支持嵌入式遍历 API。

✅ 正确做法是:

  1. 统一依赖版本:确保 neo4j-java-driver 与 neo4j-graphdb-api 版本协同(推荐同主版本号,如 driver 5.4.0 + graphdb-api 5.3.0+);
  2. 放弃 Traversal API:Neo4j 官方强烈推荐使用 Cypher —— 更声明式、可读性强、性能优化完善、且跨语言一致;
  3. 区分使用场景
    • ✅ 远程连接(Bolt)→ 使用 neo4j-java-driver + Cypher(session.executeWrite());
    • ⚠️ 嵌入式模式(仅测试/特殊场景)→ 使用 neo4j(非 -driver)包启动 GraphDatabaseServer,但需注意其已不适用于生产部署。

以下是适配 Neo4j 5.x 的 推荐实现(基于 Bolt 驱动 + Cypher)

import org.neo4j.driver.*;
import static org.neo4j.driver.Values.parameters;

public class Neo4jCypherTraversal {
    public static void main(String[] args) {
        Driver driver = GraphDatabase.driver(
            "bolt://localhost:7687",
            AuthTokens.basic("neo4j", "password")
        );

        try (Session session = driver.session()) {
            // ✅ 使用 Cypher 替代 Traversal API:深度优先查找所有可达节点
            String cypher = """
                MATCH (start:Node {id: $id})
                CALL apoc.path.subgraphNodes(start, {
                    relationshipFilter: "REL_TYPE>",
                    uniqueness: "NODE_GLOBAL"
                })
                YIELD node
                RETURN node.id AS nodeId
                """;

            // 或更轻量的原生 Cypher(无需 APOC)
            String simpleCypher = """
                MATCH (start:Node {id: $id})-[:REL_TYPE*]->(target)
                RETURN DISTINCT target.id AS nodeId
                """;

            Result result = session.executeRead(tx -> 
                tx.run(simpleCypher, parameters("id", 0))
            );

            while (result.hasNext()) {
                Record record = result.next();
                System.out.println("Node id: " + record.get("nodeId").asInt());
            }
        } finally {
            driver.close();
        }
    }
}

? 关键注意事项

  • 不要强转 Session.beginTransaction() 为 org.neo4j.graphdb.Transaction:Bolt Transaction 是 org.neo4j.driver.Transaction,与嵌入式 org.neo4j.graphdb.Transaction 完全无关,类型不兼容,编译必报错;
  • A

    PPC 扩展(如 apoc.path.subgraphNodes)需单独安装
    :若使用 APOC 功能,请确保 Neo4j 服务端已启用并安装 APOC library;
  • Maven 依赖建议(精简可靠):
    
        org.neo4j.driver
        neo4j-java-driver
        5.4.0
    
    
    
        org.neo4j
        neo4j-graphdb-api
        5.3.0
        provided 
    

? 总结:Neo4j 的演进方向是“以 Cypher 为中心”。与其调试已废弃的遍历 API,不如掌握 MATCH、PATH、COLLECT 等 Cypher 构建灵活图查询,并结合 Java Driver 的 Result 流式处理——这不仅解决当前编译问题,更是面向未来 Neo4j 生态的标准实践。