2014-05-22 2 views
2

프로젝트에서 neo4j-rest-binding을 사용했지만 트랜잭션 문제가 발생했습니다. 따라서 트랜잭션을 자체적으로 제어하려고합니다. neo4j-jdbc가 좋은 옵션이라는 것을 알았습니다. Google 포럼의 기사에서 neo4j-rest-binding보다 더 많은 찬성이 들립니다. (https://groups.google.com/forum/#!topic/neo4j/4DG_R5Yh2BM)Neo4j jdbc를 사용할 때 Node 객체를 얻는 방법은 무엇입니까?

쿼리를 수행하기 위해 neo4j-rest-binding을 사용했는데 그 결과를 Node 객체로 변환 할 수 있습니다. 내가 tx.fail(), tx.success()tx.finish()를 사용하는 경우

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를 사용하는 경우, 내가 노드 객체를 가져 오는 방법을 모르는 ...

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.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

사이퍼에서 노드를 반환하는 경우 노드는 원격 사례의지도로 반환되므로 (Map)rs.getObject("n")을 사용하여 속성에 액세스 할 수 있습니다.

getString()을 사용하는 경우 대신 JSON 표현을 사용합니다. 당신이 노드 아이디의 필요 또는 다음과 같이 명시 적으로이를 반환해야 -labels 경우

:

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

을 다시, 당신은 id, labelsdata 같은 노드 속성 다시지도를 얻을 전지.

거래를 제어하려면 connection.setAutoCommit(false)connection.commit() 또는 connection.rollback()을 사용하십시오.

+0

답장을 보내 주셔서 감사합니다! 관련 노드를 가져 오려면 관련된 노드의 정보를 얻기 위해 'MATCH (n) - [] -> (m) RETURN m'과 같은 쿼리를 만들어야합니다. 맞아? 임베디드 메서드를 사용하여 객체를 제어 할 수 있으므로 neo4j-rest-binding을 사용하는 것이 더 쉽다고 생각합니다. 당신이 생각하는 것이 더 나아 졌다고 말할 수 있습니까? 많은 감사합니다. – LoveTW

+0

또 다른 질문은 : (connection.commit()을 호출 한 후) neo4j에 데이터를 커밋 할 때 오류가 발생할 수 있습니다. 어떻게 커밋이 실패했는지 알 수 있습니까? – LoveTW

+0

내 질문을 업데이 트했습니다 :) – LoveTW

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를 통해서만 수행되어야합니다.

+0

답장을 보내 주셔서 감사합니다. neo4j-rest-binding 또는 neo4j-jdbc가 원격으로 neo4j를 사용할 때 더 낫다고 말할 수 있습니까? – LoveTW

+0

트랜잭션 컨트롤러에 대한 나의 질문을 업데이트했습니다 – LoveTW

+0

java-rest-binding을 가진 트랜잭션이 없습니다 –

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 섹션이 실행되지 않습니다.

관련 문제