我有这两段代码
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()是否需要这个?
答案 0 :(得分:1)
正如jjaderberg所说,你需要从新的ExecutionEngine中删除括号,如下所示:
return new ExecutionEngine(graphDb);
答案 1 :(得分:0)
回答你的其他问题。
您只需在数据库的生命周期内创建一次约束。
所以你甚至可以在命令行或浏览器或迁移脚本中执行此操作。
通常您只创建一次GraphDatabaseService
和ExecutionEngine
并传递它们。只需确保在程序结束时或通过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"