关于getOrCreateWithCypher()的三个(小)问题

时间:2014-03-09 21:23:28

标签: neo4j

我有这两段代码

try ( Transaction tx = graphdb.beginTx() )
{
    graphdb.schema()
            .constraintFor( DynamicLabel.label( "User" ) )
            .assertPropertyIsUnique( "name" )
            .create();
    tx.success();
}

return new ExecutionEngine( graphdb() );

Node result = null;
ResourceIterator<Node> resultIterator = null;
try ( Transaction tx = graphDb.beginTx() )
{
    String queryString = "MERGE (n:User {name: {name}}) RETURN n";
    Map<String, Object> parameters = new HashMap<>();
    parameters.put( "name", username );
    resultIterator = engine.execute( queryString, parameters ).columnAs( "n" );
    result = resultIterator.next();
    tx.success();
    return result;
}

这两种方法有可能分别?如果是这样: 每次我创建一个新对象时,我都会阅读两个方法吗?

最后:

return new ExecutionEngine (graphDb ());

我收到错误建议我构建方法graphDb()是否需要这个?

2 个答案:

答案 0 :(得分:1)

正如jjaderberg所说,你需要从新的ExecutionEngine中删除括号,如下所示:

return new ExecutionEngine(graphDb);

答案 1 :(得分:0)

回答你的其他问题。

您只需在数据库的生命周期内创建一次约束。

所以你甚至可以在命令行或浏览器或迁移脚本中执行此操作。

通常您只创建一次GraphDatabaseServiceExecutionEngine并传递它们。只需确保在程序结束时或通过ShutdownHook shutdown()图形数据库。

您可以使用一些辅助方法来简化代码:

private final static String MERGE_USER = "MERGE (n:User {name: {name}}) RETURN n";

try (Transaction tx = graphDb.beginTx()) {
    Node result =  single(engine.execute( MERGE_USER, map("name",username )).columnAs( "n" ));
    tx.success();
    return result;
}

当Cypher处理自己的交易时,你不需要外部的tx:

    Node result =  single(engine.execute( MERGE_USER, map("name",username )).columnAs( "n"