Neo4j - 如何处理不兼容的RestGraphDatabase调用

时间:2014-03-14 16:26:20

标签: java rest neo4j cypher embedded-database

在我的项目中,我通过GraphDatabaseService使用Neo4j的Core-API。在测试中,我们有EmbeddedGraphDatabase,其中一切都按预期工作。然后我编写了一些测试来查看我的实现在RestGraphDatabase上的行为,只是为了找出它大部分都失败了! (GraphDatabaseService由Rest-API的GraphDatabaseFactory获取,因此没有instanceof检查我不知道它是哪一个) 一些例子:

如果我使用GlobalGraphOperations,一切都会失败,因为RestGraphDatabase不支持GlopalGraphOperations。 (奇怪的是,GlobalGraphOperations.at不会抛出GlobalGraphOperations的所有方法。)

然后我想“好吧我会用Cypher来获得同样的行为。” 我试着实现这样的方法:

public getNodesWithLabel(String label, GraphDatabaseService graphService){
    try(Transaction tx graphService.beginTx()){
        ExecutionEngine ee = new ExecutionEngine(graphService);
        //throws NullPOinterExeption in execute method
        ExecutionResult result = ee.execute("MATCH (n:" + label + ") RETURN n");
        result.columnAs("n");
        //... mapping of Nodes
    }
}

通过API搜索我看到,RestCypherQueryEngine是通过RestAPIFascade初始化的。这里的问题是,方法不可互换,不实现相同的接口,返回类型完全不同(即ExecutionResult vs QueryResult

所以我的问题是:有没有办法,从Neo4j获得相同的行为,其中使用的技术(Rest vs. Embedded)无关紧要?某种技术独立的Wrapper将满足我的需求。

顺便说一下,我在版本2中使用Neo4j

1 个答案:

答案 0 :(得分:1)

就是不要这样做。它会做什么(如果它工作)将通过线路执行对数据库的每次调用,读取和写入节点,rels和属性。你不想那样做。

改为使用它。

queryEngine = new RestCypherQueryEngine(restGraphDb.getRestAPI());
queryEngine.query(query, params)

这会将查询发送到服务器并在那里运行。