2016-01-04 92 views
1

我正在Spring Data v1.3.1中使用Spring Data Neo4J。我的Neo4J版本是2.1.6。 比方说,我有一个实体人员,其中可以有一个人名为Friend的关系。因此,我将Set定义为实体的属性之一,请使用@RelatedTo注释并为其指定一个名称为Friend的类型。如何在Neo4J/Spring中创建与同一实体的不同关系?

如果我想有多种其他的关系,都具有相同的实体而已,让我们说,EnemyAcquaintance等我一定要定义,为所有这些单独的属性?我不能动态地传递关系吗?

参考:

@NodeEntity 
public class Person { 

@RelatedTo(type="FRIEND", direction=Direction.BOTH) 
public @Fetch Set<Person> friends; 

//Do I have to do it like this ? This is odd. 
@RelatedTo(type="ENEMY", direction=Direction.BOTH) 
public @Fetch Set<Person> enemies; 

//getter setters 

} 

编辑1 -----------

现在,我面临的一个问题,在批量创建节点。解释下面的问题: 考虑迈克尔建议的方法后,这里是我的。 基本上,我必须批量创建大量节点。该节点Person将具有包含唯一索引的属性。我们称之为name。所以,当创建关系FriendEnemy时,我希望它们与具有唯一名称的人一起创建。 因此,将有两个步骤:

  1. 创建个人节点(花费大量时间)

  2. 它们之间建立关系(并不需要太多的时间,30-40毫秒。 )

我尝试了批量创建节点的不同方法。

一种方法是提交事务节点中的某个号码已被保存后。 我曾跟随这个link 我不知道有关的性能改善与调用neo4jTemplate.save()仍然需要大约500毫秒。

从我的日志:

Time taken to execute save:=612 ms 
Time taken to execute save:=566 ms 

难道这好吗?

另一种方法是使用暗号,由迈克尔在他的博客中建议,here.

我用这样的暗号查询:

WITH [{name: "Person1", gravity: 1}, 
     {name: "Person2", gravity: 2}] AS group 
FOREACH (person IN group | 
CREATE (e:Person {label: person.name, gravity: person.gravity})) 

这种方法问题的节点都得到批量创建,但名称属性上的唯一索引被忽略。看来,我必须在保存每个节点后进行提交。

那么,有没有其他办法,我可以以更快的方式批量创建节点?

回答

0

您可以通过创建不同类型的关系实体来处理它。可以直接使用Neo4jTemplatecreateRelationshipBetween)。

如果你有这样一个动态设置,你的实体会是什么样子?

您不必在实体中列出关系。如果它们是动态的,你也可以在你的实体中拥有基本属性,并通过存储库访问这些关系。

+0

我用我的最新发现更新了我的问题。您提出的方法确实解决了这个问题,但节点创建需要很长时间。你可以请看一下,让我知道,如果neo4j花费那么多时间来创建一个节点,或者建议任何其他方式都可以? –

相关问题