【问题标题】:Use Neo4j algorithms from Java and Tinkerpop使用来自 Java 和 Tinkerpop 的 Neo4j 算法
【发布时间】:2018-03-15 20:58:14
【问题描述】:

我使用 Neo4J 作为我的底层 GraphDB,在我的 Java 应用程序中使用 Tinkerpop 3.3.1。我使用 Neo4JGraph.open ("/tmp/filename") 在 Java 中创建图形,然后从那里我只使用 Tinkerpop Java API 创建节点、边和运行遍历。

我想在我的 Tinkerpop 图上执行 Dijkstra 最短路径。 Neo4J 是我的底层 GraphDB,内置了这个算法,所以我想使用它。我使用 make this call 来获取 Neo4J 图形,并从中获取一些 Neo4JNode 类型。

Neo4jGraphAPI neo4J = this.graphPV.getBaseGraph();
Neo4jNode start = neo4J.getNodeById(1);
Neo4jNode end = neo4J.getNodeById(2);

这可行,但现在我不确定下一步该做什么。我想我会将这些节点传递给 Neo4J 路径查找器,但 findSinglePath 方法采用 Node 类型,而不是基于 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

【问题讨论】:

    标签: java neo4j tinkerpop


    【解决方案1】:

    Neo4jNodeImplNeo4jRelationshipImpl 都扩展了 Neo4jEntityImpl,它有一个公共的 getEntity() 方法,该方法返回原生 neo4j Node/Relationship

    很遗憾,getEntity() 不在Neo4jEntity 接口中(因此不在Neo4jNodeNeo4jRelationship 接口中)。因此,要使用getEntity(),您的项目必须添加对impl module 的依赖项并使用类强制转换。例如:

    Neo4jGraphAPI neo4J = this.graphPV.getBaseGraph();
    Neo4jNode start = neo4J.getNodeById(1);
    Node nativeStart = ((Neo4jNodeImpl)start).getEntity();
    

    或者,如果您不想依赖 impl 模块,可以选择性能较低的选项。您可以使用Neo4jEntity.getId() 方法获取底层neo4j 节点/关系的本机ID,然后执行neo4j 查询以获取该节点/关系。

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多