如何在使用Neo4j jdbc时获取Node对象?

时间:2014-05-22 13:05:26

标签: mongodb transactions neo4j

我在我的项目中使用了neo4j-rest-binding,但是我遇到了一些事务问题,所以我想通过自己控制事务。我发现neo4j-jdbc是一个不错的选择,它听起来比谷歌论坛中的文章更具有neo4j-rest-binding的优点。 (https://groups.google.com/forum/#!topic/neo4j/4DG_R5Yh2BM

我使用neo4j-rest-binding进行查询,我可以将结果转换为Node对象。

QueryResult<Map<String, Object>> result = engine.query("MATCH (n) RETURN n")
Iterator<Node> nodeIter = result.to(Node.class).iterator();
// if I want to get the relationship of the node
Iterator<Relationship> outRelIter = node.getRelationships(Direction.OUTGOING).iterator();
...

但是当我使用neo4j-jdbc进行查询时,我不知道如何获取Node对象......

ResultSet rs = stmt.executeQuery("MATCH (n) RETURN n");
while(rs.next()) {  
    Map<String, Object> res = (Map<String, Object>) rs.getObject("n");
    // how to get Node object?
}

另一个问题是,如果我使用tx.fail()tx.success()tx.finish(),我怎么知道交易何时失败?我知道如果没有调用tx.success它会回滚,但是由于我将MongoDB和Neo4j组合在一起,我想在Neo4j失败时回滚MongoDB。如:

//Do some MongoDB operation...
...

//Do some Neo4j operation...
tx.begin();
try {
    ...
    if(???) // if transaction fail
        // rollback MongoDB
    else
        tx.success();
} finally {
    tx.close();
}

使用neo4j-jdbc时是否有效? (我自己回答了这个问题)

try {
    conn.setAutoCommit(false); // for Neo4j
    //Do some MongoDB operation...
    ...

    //Do some Neo4j operation...
    conn.commit();
} catch(SQLException e) {
    conn.rollback(); // for Neo4j
    // rollback MongoDB
}

非常感谢!

3 个答案:

答案 0 :(得分:3)

如果从cypher返回节点,它将在远程情况下作为Map返回,因此您可以使用(Map)rs.getObject("n")来访问该属性。

如果使用getString(),则会获得JSON表示。

如果你需要node-id或-labels,你必须明确地返回它们,如下所示:

MATCH (n) 
RETURN { id : id(n), labels : labels(n), data: n } as node

然后,您再次使用idlabels和节点属性作为data字段返回地图。

为了控制交易,您使用connection.setAutoCommit(false)connection.commit()connection.rollback()

答案 1 :(得分:2)

Cypher JDBC不返回节点,而是返回节点的属性,如您所见。要将节点作为对象:

ResultSet rs = stmt.executeQuery("MATCH (n) RETURN id(n)");
while(rs.next()) {  
    long nodeId = (long) rs.getObject("id(n)");
    Node n = graphDb.getNodeById(nodeId);
}

然而,这仅适用于嵌入式模式。远程使用Cypher JDBC时,没有节点概念。图中的每个操作都应该通过Cypher完成。

答案 2 :(得分:0)

如果您想自己控制Neo4j和MongoDB的交易。您可以使用以下结构:

try {
    conn.setAutoCommit(false); // for Neo4j
    //Do some Neo4j operation...

    //Do some MongoDB operation...

    conn.commit(); // if Mongo and Neo4j both success, data will be committed to Neo4j
} catch(SQLException e) {
    conn.rollback(); // for Neo4j
    // rollback MongoDB
}

由于MongoDB有自己的方式在同一文档中回滚。如果Neo4j成功,但MongoDB失败了。 MongoDB将回滚,它将获得异常,neo4j也将回滚。 如果Neo4j失败,它将不会执行mongo部分。