gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:26:26 25 4
gpt4 key购买 nike

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

字面代码是:

Create a Cypher execution engine and a unique constraint.


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

return new ExecutionEngine( graphdb() );

Use MERGE to create a unique node.


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;
}

最佳答案

The code appears to be creating a constraint with Cypher where the user and name must be unique, correct?



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

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

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

这是在此语句中管理的:
graphdb.schema()
.constraintFor( DynamicLabel.label( "User" ) )
.assertPropertyIsUnique( "name" )
.create();
tx.success();

要在 Cypher 中执行此操作,它看起来像这样:
CREATE CONSTRAINT ON (user:User) ASSERT user.name IS UNIQUE

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

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

If so, why are they storing things in a hash?



在第二段代码中,我在这里复制了它以便于引用:
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;
}

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

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

If the insertion to the hash fails (not unique), then the try fails? If that is so, why even buid the constraint?



由于 MERGE子句获取或创建(如果记录不存在则创建),则无法在此上下文中触发唯一性约束。如果您要尝试使用 CREATE创建具有重复 name 的节点的语句属性(property),那么交易将失败。如果您尝试 SET,也是如此。另一个节点上的 name 属性具有重复的 name具有 User 的节点集中的属性标签。

关于neo4j - 如何在 neo4j 中创建唯一节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22276900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com