我在我的项目中使用了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
}
非常感谢!
答案 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
然后,您再次使用id
,labels
和节点属性作为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部分。