Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 关于getOrCreateWithCypher()的三个(小)问题_Neo4j - Fatal编程技术网

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"