You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neo4j Traversal API依赖问题:Transaction无法解析findNode等方法

Neo4j Traversal API依赖与API混用问题解决

问题根源

你的代码同时混用了Neo4j Java远程驱动(org.neo4j.driver包)和嵌入式GraphDB API(org.neo4j.graphdb包),导致Transaction类出现冲突:

  • 远程驱动的Transaction类没有traversalDescription()和findNode()方法;
  • 依赖的neo4j-graphdb-api版本(3.0.1)与远程驱动版本(4.1.1)不匹配,进一步加剧了API不兼容问题。

你的代码及依赖

Java代码

import org.neo4j.driver.Driver;
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.GraphDatabase;import org.neo4j.driver.Session;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.traversal.*;

public class Main {
    public static void main(String[] args) {
        Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password"));
        try (Session session = driver.session()) {
            // Start a new transaction
            try (Transaction tx = (Transaction) session.beginTransaction()) {
                // Get the traversal description
                TraversalDescription traversal = tx.traversalDescription()
                        .depthFirst()
                        .uniqueness(Uniqueness.NODE_GLOBAL);
                Node startNode = tx.findNode(Label.label("Node"), "id", 0);
                // Traverse the graph
                Traverser traverser = traversal.traverse(startNode);
                for (Path path : traverser) {
                    Node node = path.endNode();
                    System.out.println("Node id: " + node.getProperty("id"));
                }
                tx.success();
            }
        } finally {
            driver.close();
        }
    }
}

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>Traversal</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ZBD</name>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.neo4j.driver</groupId>
            <artifactId>neo4j-java-driver</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-graphdb-api</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

解决方案

1. 明确API使用场景

  • Traversal API属于嵌入式GraphDB API:仅适用于本地嵌入式数据库或Neo4j服务器插件开发,不支持远程连接。
  • 远程连接场景:放弃Traversal API,改用Cypher查询实现遍历逻辑(如MATCH p=(n:Node {id:0})-[*]->(m) RETURN p),通过Java远程驱动执行。

2. 修正依赖(嵌入式场景)

移除远程驱动依赖,添加匹配版本的嵌入式核心依赖,确保所有Neo4j依赖版本一致:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>groupId</groupId>
    <artifactId>Traversal</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ZBD</name>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <neo4j.version>4.1.1</neo4j.version>
    </properties>
    <dependencies>
        <!-- 嵌入式Neo4j核心依赖,包含Traversal API -->
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-core</artifactId>
            <version>${neo4j.version}</version>
        </dependency>
        <!-- 可选:内存数据库,用于本地测试 -->
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-inmemory</artifactId>
            <version>${neo4j.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3. 修正Java代码(嵌入式场景)

使用嵌入式API的方式连接数据库并执行遍历:

import org.neo4j.graphdb.*;
import org.neo4j.graphdb.traversal.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;

public class Main {
    public static void main(String[] args) {
        // 初始化嵌入式数据库,指定本地存储路径
        GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase("data/databases/graph.db");
        
        try (Transaction tx = db.beginTx()) {
            // 创建遍历描述器
            TraversalDescription traversal = tx.traversalDescription()
                    .depthFirst()
                    .uniqueness(Uniqueness.NODE_GLOBAL);
            
            // 查找起始节点
            Node startNode = tx.findNode(Label.label("Node"), "id", 0);
            
            if (startNode != null) {
                // 执行遍历并输出结果
                Traverser traverser = traversal.traverse(startNode);
                for (Path path : traverser) {
                    Node node = path.endNode();
                    System.out.println("Node id: " + node.getProperty("id"));
                }
            } else {
                System.out.println("未找到id为0的Node节点");
            }
            
            tx.commit();
        } finally {
            // 关闭数据库
            db.shutdown();
        }
    }
}

4. 远程场景替代方案

如果需要远程连接Neo4j,用Cypher实现遍历:

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

public class RemoteTraversal {
    public static void main(String[] args) {
        Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password"));
        
        try (Session session = driver.session()) {
            // 用Cypher查询实现遍历
            Result result = session.run("MATCH p=(n:Node {id: $startId})-[*]->(m) RETURN p", parameters("startId", 0));
            
            while (result.hasNext()) {
                Record record = result.next();
                Path path = record.get("p").asPath();
                Node endNode = path.endNode();
                System.out.println("Node id: " + endNode.get("id").asInt());
            }
        } finally {
            driver.close();
        }
    }
}

额外建议

  • 不要混合不同版本的Neo4j依赖,版本不一致会导致大量API兼容问题;
  • 优先使用Cypher实现图遍历逻辑,它是Neo4j的标准查询语言,支持远程和嵌入式场景;
  • Traversal API适合复杂的自定义遍历逻辑,仅在嵌入式或插件开发场景下使用。

内容的提问来源于stack exchange,提问作者maciejwww

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:10:29