Mongodb 使用Neo4jJDBC时如何获取节点对象?

Mongodb 使用Neo4jJDBC时如何获取节点对象?,mongodb,transactions,neo4j,Mongodb,Transactions,Neo4j,我在项目中使用了neo4j rest绑定,但我面临一些事务问题,所以我想自己控制事务。我发现Neo4JJDBC是一个不错的选择,而且它听起来比google论坛文章中的Neo4JREST绑定有更多的优点。() 我使用neo4j rest绑定进行查询,并且可以将结果转换为节点对象 QueryResult<Map<String, Object>> result = engine.query("MATCH (n) RETURN n") Iterator<Node> n

我在项目中使用了neo4j rest绑定,但我面临一些事务问题,所以我想自己控制事务。我发现Neo4JJDBC是一个不错的选择,而且它听起来比google论坛文章中的Neo4JREST绑定有更多的优点。()

我使用neo4j rest绑定进行查询,并且可以将结果转换为节点对象

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();
...
当我使用neo4jjdbc时它能工作吗?(我已经自己回答了这个问题)


非常感谢

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返回一个节点,它将在远程情况下作为映射返回,因此您可以使用
(Map)rs.getObject(“n”)
访问该属性

如果使用getString(),则会得到一个JSON表示

如果需要节点id或-标签,则必须明确返回它们,如下所示:

MATCH (n) 
RETURN { id : id(n), labels : labels(n), data: n } as node
然后再次获得一个映射,其中包含
id
标签
,节点属性为
数据
字段


要控制事务,您可以使用
connection.setAutoCommit(false)
connection.commit()
connection.rollback()

,如果您想自己控制与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部分。

感谢您的回复!如果我想获取相关节点,我必须进行类似“匹配(n)-[]->(m)RETURN m”的查询以获取相关节点的信息。是这样吗?我认为neo4j rest绑定更容易使用,因为我可以使用嵌入式方法来控制对象。你能告诉我你认为哪个更好吗?非常感谢。另一个问题是:在向neo4j提交数据时(调用
connection.commit()
后),有时可能会发生错误,我怎么知道提交失败?我不知道您的第一句评论是什么意思“我认为neo4j rest绑定更容易使用,因为我可以使用嵌入式方法来控制对象”因为当我想找到节点A的相关节点时,我可以使用
nodeA.getRelationships(Direction.OUTGOING.iterator()
获取关系,然后使用该关系获取neo4j rest绑定中的开始和结束节点。但是,我必须使用cypher来获得neo4jjdbc中的关系。我最好使用neo4j的java嵌入式方法。请注意,在新的JDBC驱动程序中,您只需返回
n
,它就会以带有
\u id
\u标签
条目的映射形式返回。谢谢您的回复!你能告诉我远程使用neo4j时neo4j rest绑定或neo4j jdbc更好吗?我更新了关于事务控制器的问题这里没有使用java rest绑定的事务
tx.fail()
问题是针对嵌入式案例的。我还想知道如何在neo4j jdbc中控制失败的情况。我原来的帖子里有一个sudo代码。谢谢:)
ResultSet rs = stmt.executeQuery("MATCH (n) RETURN id(n)");
while(rs.next()) {  
    long nodeId = (long) rs.getObject("id(n)");
    Node n = graphDb.getNodeById(nodeId);
}
MATCH (n) 
RETURN { id : id(n), labels : labels(n), data: n } as node
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
}