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
相关产品推荐
相关产品推荐

