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

如何在neo4j中创建唯一节点?,neo4j,Neo4j,我希望确保我不会使用neo4j数据库创建多个节点。我知道这是首选的方法(即使在回顾了这一点之后),但我不理解该示例中的代码到底在做什么。有人能为门外汉/noob详细说明一下吗 文字代码为: 创建密码执行引擎和唯一约束 使用“合并”创建唯一的节点 节点结果=null; ResourceIterator resultIterator=null; try(事务tx=graphDb.beginTx()) { String queryString=“MERGE(n:User{name:{name})返回n

我希望确保我不会使用neo4j数据库创建多个节点。我知道这是首选的方法(即使在回顾了这一点之后),但我不理解该示例中的代码到底在做什么。有人能为门外汉/noob详细说明一下吗

文字代码为:

创建密码执行引擎和唯一约束

使用“合并”创建唯一的节点

节点结果=null;
ResourceIterator resultIterator=null;
try(事务tx=graphDb.beginTx())
{
String queryString=“MERGE(n:User{name:{name})返回n”;
映射参数=新的HashMap();
参数。输入(“名称”,用户名);
resultIterator=engine.execute(queryString,parameters).columns(“n”);
结果=resultIterator.next();
成功();
返回结果;
}
代码似乎正在使用Cypher创建约束,其中 用户名和名称必须是唯一的,对吗

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

在这种情况下,
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可选模式的更多信息:

如果是这样的话,他们为什么要把东西存储在散列中

在第二段代码中,为了便于参考,我复制了这段代码:

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;
}
然后,通过提供查询字符串来执行事务,该查询字符串包含带有声明的参数占位符的Cypher语句,以及包含键/值列表的参数映射

如果对散列的插入失败(不是唯一的),那么try会失败吗?如果是这样,为什么还要建立约束


由于
MERGE
子句获取或创建(如果记录不存在,则会创建),因此在此上下文中无法触发唯一性约束。如果尝试使用
CREATE
语句创建具有重复
名称
属性的节点,则事务将失败。如果您试图在另一个节点上
设置
名称属性,并且在带有
用户
标签的节点集中具有重复的
名称
属性,则情况也是如此。

您不确定代码的哪一部分?是密码还是Java?我可以解释这两个问题,只是让我知道你到底在哪些方面不够清楚。干杯,抱歉,两者都有点。。。我看到他们(似乎)正在用Cypher创建一个约束,其中用户名和名称必须是唯一的,对吗?如果是这样的话,他们为什么要把东西存储在散列中?如果对散列的插入失败(不是唯一的),那么try会失败吗?如果是这样的话,为什么还要建立约束呢?还有,如果我有一个巨大的集合,这是否意味着我必须创建整个集合的has,只是为了看看是否有什么是独一无二的?如果我有,比如说,几百万条记录,那就有问题了,对吧?让我知道我提供的答案是否回答了你的第二个问题,如果没有,我会更新它。我想我现在得到了,谢谢!在命令行上,而不是通过API,我想如果我创建了下面列出的约束(Cypher代码),然后也提交了一个merge语句(再次使用Cypher),我可以确保手动输入也是唯一的,对吗?
CREATE CONSTRAINT ON (user:User) ASSERT user.name IS UNIQUE
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;
}
resultIterator = engine.execute( queryString, parameters ).columnAs( "n" );