Neo4j 关于getOrCreateWithCypher()的三个(小)问题
我有两段代码Neo4j 关于getOrCreateWithCypher()的三个(小)问题,neo4j,Neo4j,我有两段代码 try ( Transaction tx = graphdb.beginTx() ) { graphdb.schema() .constraintFor( DynamicLabel.label( "User" ) ) .assertPropertyIsUnique( "name" ) .create(); tx.success(); } return new ExecutionEngine(
try ( Transaction tx = graphdb.beginTx() )
{
graphdb.schema()
.constraintFor( DynamicLabel.label( "User" ) )
.assertPropertyIsUnique( "name" )
.create();
tx.success();
}
return new ExecutionEngine( graphdb() );
及
我得到一个错误,建议我构建方法graphDb(),是否需要这样做?正如jjaderberg所指出的,您需要从新的ExecutionEngine中删除括号,如下所示:
return new ExecutionEngine(graphDb);
回答你的另一个问题 在数据库的生命周期中,只需创建一次约束 因此,您甚至可以在命令行、浏览器或迁移脚本中执行此操作 通常只创建一次
GraphDatabaseService
和ExecutionEngine
,并将它们传递给其他人。只需确保shutdown()
在程序末尾或通过ShutdownHook访问图形数据库
您可能可以使用一些辅助方法来简化代码:
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"
我不理解你的问题,但假设
graphDb
是你的GraphDatabaseService
对象,你调用它就好像它是你应该传递引用的方法一样。执行新的执行引擎(graphDb)代码>,不带括号。谢谢您的回答!关于第一个问题,我的意图是任何新的(唯一的)Nod的创建我是否必须调用2个方法?是否可以这样调用:Node classNode=getOrCreateWithCypher(classString,db,createExecutionEngineeandConstraint(db))代码>我无法确定在调用另一个方法之前调用了哪个方法。
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;
}
Node result = single(engine.execute( MERGE_USER, map("name",username )).columnAs( "n"