我想确保我不使用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)
代码似乎是在创建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,这意味着我们想要MATCH或CREATE具有任意名称的用户.该名称作为参数提供,该参数在以下行中{name}命名的哈希映射中提供parameters.哈希映射充当我们的参数的简单键/值列表,其中键必须与Cypher查询中提供的参数匹配,在本例中{name}.
resultIterator = engine.execute( queryString, parameters ).columnAs( "n" );
Run Code Online (Sandbox Code Playgroud)
然后通过提供查询字符串来执行事务,该查询字符串包含带有声明的参数占位符的Cypher语句,以及包含键/值列表的参数映射.
如果对哈希的插入失败(不唯一),则尝试失败?如果是这样,那么为什么要提出约束?
由于MERGE子句获取或创建(如果记录不存在,则创建发生),因此无法在此上下文中触发唯一性约束.如果您尝试使用该CREATE语句创建具有重复name属性的节点,则事务将失败.如果您尝试在具有标签的节点集中SET具有重复name属性的另一节点上的名称属性,则也是如此User.
| 归档时间: |
|
| 查看次数: |
4221 次 |
| 最近记录: |