neo4j-与java建立独特的关系

neo4j-与java建立独特的关系,java,neo4j,cypher,Java,Neo4j,Cypher,我想使用JavaAPI创建一个唯一的关系(通过Cypher查询,我可以创建唯一的) 例如: START n=node:node_auto_index(name='Neo'), t=node:node_auto_index(name='The Architect') CREATE UNIQUE n-[r:SPEAKS_WITH]-t RETURN n AS Neo,r 提前谢谢 java API的级别较低。据我所知,没有方便的方法,所以您需要自己编写代码。未经测试,但您可能会想

我想使用JavaAPI创建一个唯一的关系(通过Cypher查询,我可以创建唯一的)

例如:

START n=node:node_auto_index(name='Neo'), 
      t=node:node_auto_index(name='The Architect') 
CREATE UNIQUE n-[r:SPEAKS_WITH]-t 
RETURN n AS Neo,r

提前谢谢

java API的级别较低。据我所知,没有方便的方法,所以您需要自己编写代码。未经测试,但您可能会想到:

Transaction transaction = graphDb.beginTx();
try {
  ReadableIndex<Node> autoNodeIndex = graphDb.index().getNodeAutoIndexer().getAutoIndex();
  Node n = autoNodeIndex.get("name", "Neo").getSingle();
  Node a = autoNodeIndex.get("name", "The Architect").getSingle();
  tx.acquireWriteLock(n);
  tx.acquireWriteLock(a);
  Boolean created = false;
  for(Relationship r : n.getRelationships(MyRels.SPEAKS_WITH) {
    if(r.getOtherNode(n).equals(a)) { // put other conditions here, if needed
      created = true;
      break;
    }
  }
  if(!created) {
    n.createRelationshipTo(a, MyRels.SPEAKS_WITH);
  }
  tx.success();
} finally {
  tx.finish();
}
Transaction-Transaction=graphDb.beginTx();
试一试{
ReadableIndex autoNodeIndex=graphDb.index().GetNodeAutoIndex().getAutoIndex();
Node n=autoNodeIndex.get(“name”,“Neo”).getSingle();
节点a=autoNodeIndex.get(“名称”、“架构师”).getSingle();
tx.acquireWriteLock(n);
tx.acquireWriteLock(a);
布尔值=假;
for(Relationship r:n.getRelationships(MyRels.SPEAKS_WITH){
if(r.getOtherNode(n).equals(a)){//如果需要,请在此处放置其他条件
创建=真;
打破
}
}
如果(!已创建){
n、 createRelationshipTo(a,MyRels.Talking_);
}
成功();
}最后{
tx.finish();
}

更新Mattias的评论

这将不是线程安全的,如果有两个事务同时执行此操作,则可能会创建两个关系。如果您希望n和a是线程/事务安全的,请手动获取锁。谢谢Mattias。我稍后将尝试找出如何执行此操作。K,我想我已将其添加到了中。