如何在neo4j中创建唯一的节点?

Wil*_*ill 4 neo4j

我想确保我不使用neo4j数据库创建多个节点.我在这里看到这是首选方法(即使在查看此页面之后),但我不明白代码在该示例中的实际作用.有人可以详细说明外行/菜鸟吗?

文字代码是:

创建Cypher执行引擎和唯一约束.

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

return new ExecutionEngine( graphdb() );
Run Code Online (Sandbox Code Playgroud)

使用MERGE创建唯一节点.

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;
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*ani 6

代码似乎是在创建Cypher的约束,其中用户和名称必须是唯一的,对吗?

在此示例中创建约束的代码在Java API for Neo4j中进行管理.标签将节点组合在一起,任何节点都可以有多个标签.请参阅此处以了解有关标签的更多信

http://docs.neo4j.org/chunked/milestone/graphdb-neo4j-labels.html

在这种情况下,User是分配给图中一组节点的标签.当我们创建一个唯一约束时,我们告诉Neo4j在任意标签内的属性上声明唯一性约束.

这是在本声明中管理的:

graphdb.schema()
        .constraintFor( DynamicLabel.label( "User" ) )
        .assertPropertyIsUnique( "name" )
        .create();
tx.success();
Run Code Online (Sandbox Code Playgroud)

要在Cypher中执行此操作,它看起来像这样:

CREATE CONSTRAINT ON (user:User) ASSERT user.name IS UNIQUE
Run Code Online (Sandbox Code Playgroud)

请参阅此处以了解有关Neo4j 2.0可选模式的更多信息:

http://docs.neo4j.org/chunked/milestone/query-constraints.html

如果是这样,为什么他们将东西存储在哈希中?

在第二块代码中,我在这里复制了以便于参考:

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;
}
Run Code Online (Sandbox Code Playgroud)

我们在事务上下文中包装托管调用.在第4行,我们创建了我们的查询字符串:MERGE (n:User {name: {name}}) RETURN n,这意味着我们想要MATCHCREATE具有任意名称的用户.该名称作为参数提供,该参数在以下行中{name}命名的哈希映射中提供parameters.哈希映射充当我们的参数的简单键/值列表,其中键必须与Cypher查询中提供的参数匹配,在本例中{name}.

resultIterator = engine.execute( queryString, parameters ).columnAs( "n" );
Run Code Online (Sandbox Code Playgroud)

然后通过提供查询字符串来执行事务,该查询字符串包含带有声明的参数占位符的Cypher语句,以及包含键/值列表的参数映射.

如果对哈希的插入失败(不唯一),则尝试失败?如果是这样,那么为什么要提出约束?

由于MERGE子句获取或创建(如果记录不存在,则创建发生),因此无法在此上下文中触发唯一性约束.如果您尝试使用该CREATE语句创建具有重复name属性的节点,则事务将失败.如果您尝试在具有标签的节点集中SET具有重复name属性的另一节点上的名称属性,则也是如此User.