使用Java和Tinkerpop中的Neo4j算法
我使用Neo4J作为我的底层GraphDB,Tinkerpop 3.3.1位于Java应用程序的顶部。我使用Neo4JGraph.open(“/tmp/filename”)在Java中创建图形,然后从那里我只使用Tinkerpop Java API创建节点、边和运行遍历 我想在Tinkerpop图上执行Dijkstra最短路径。Neo4J是我的底层GraphDB,它内置了这个算法,所以我想使用它。我使用makethis调用来获取Neo4J图,并从中获取一些Neo4JNode类型使用Java和Tinkerpop中的Neo4j算法,java,neo4j,tinkerpop,Java,Neo4j,Tinkerpop,我使用Neo4J作为我的底层GraphDB,Tinkerpop 3.3.1位于Java应用程序的顶部。我使用Neo4JGraph.open(“/tmp/filename”)在Java中创建图形,然后从那里我只使用Tinkerpop Java API创建节点、边和运行遍历 我想在Tinkerpop图上执行Dijkstra最短路径。Neo4J是我的底层GraphDB,它内置了这个算法,所以我想使用它。我使用makethis调用来获取Neo4J图,并从中获取一些Neo4JNode类型 Neo4jGra
Neo4jGraphAPI neo4J = this.graphPV.getBaseGraph();
Neo4jNode start = neo4J.getNodeById(1);
Neo4jNode end = neo4J.getNodeById(2);
这是可行的,但现在我不知道下一步该怎么办。我想我会将这些节点传递给Neo4J pathfinder,但findSinglePath方法采用的是节点类型,而不是基于Tinkerpop的Neo4JNode。我试过选角,但出现了一个例外。我可以将Tinkerpop Neo4JNode转换为基础Neo4J API将接受的Neo4J节点类型吗
dijkstraPathFinder = GraphAlgoFactory.dijkstra(expander, costEvaluator );
WeightedPath path = dijkstraPathFinder.findSinglePath((Node)start, (Node)end );
结果:
警告:服务异常java.lang.ClassCastException:
org.neo4j.tinkerpop.api.impl.Neo4jNodeImpl不能强制转换为
org.neo4j.graphdb.Node
Neo4jNodeImpl
和Neo4jRelationshipImpl
都扩展了Neo4jEntityImpl
,它有一个公共getEntity()
方法,返回本机neo4j节点
/关系
不幸的是,getEntity()
不在neo4jntity
接口中(因此不在Neo4jNode
和Neo4jRelationship
接口中)。因此,要使用getEntity()
,您的项目必须添加对的依赖项并使用类强制转换。例如:
Neo4jGraphAPI neo4J = this.graphPV.getBaseGraph();
Neo4jNode start = neo4J.getNodeById(1);
Node nativeStart = ((Neo4jNodeImpl)start).getEntity();
或者,如果您不想依赖impl模块,则有一个性能较差的选项。您可以使用Neo4jEntity.getId()
方法获取底层neo4j节点/关系的本机ID,然后执行neo4j查询以获取该节点/关系