我正在将 Spring Data Neo4J 与 Spring Boot v1.3.1 结合使用。我的 Neo4J 版本是 2.1.6 。
假设我有一个实体 Person,它可以与一组 Person 建立名为 Friend
的关系。因此,我将 Set
定义为实体的属性之一,使用 @RelatedTo
注释并为其指定一个名为 Friend
的类型。
如果我想要拥有多个其他关系,并且所有关系都仅与同一实体相关,例如敌人
、熟人
等,该怎么办?我是否必须为所有这些关系定义单独的属性?我不能动态传递关系吗?
供引用:
@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
。因此,当创建关系“ friend ”或“敌人”时,我希望使用具有唯一名称的人来创建它们。
因此,将有两个步骤:
创建 Person 节点。(需要大量时间)
创建它们之间的关系。(不需要太多时间,大约 30-40 毫秒)
我尝试了批量创建节点的不同方法。
一种方法是在保存一定数量的节点后提交事务。
我已经关注了这个link
我不确定性能是否有所提高,因为调用 neo4jTemplate.save()
仍然需要大约 500 毫秒。
来 self 的日志:
Time taken to execute save:=612 ms
Time taken to execute save:=566 ms
这样应该可以吗?
另一种方法是使用 Cypher,正如 Michael 在他的博客 here. 中所建议的那样。
我使用了这样的 Cypher 查询:
WITH [{name: "Person1", gravity: 1},
{name: "Person2", gravity: 2}] AS group
FOREACH (person IN group |
CREATE (e:Person {label: person.name, gravity: person.gravity}))
这种方法的问题是节点确实是批量创建的,但名称属性上的唯一索引被忽略。看来,我必须在保存每个节点后提交。
那么,有没有其他方法可以更快地批量创建节点?
最佳答案
您可以通过创建不同类型的关系实体来处理它。
或者直接使用Neo4jTemplate
(createRelationshipBetween
)。
如果您有这样的动态设置,您的实体会是什么样子?
您不必列出实体中的关系。如果它们是动态的,您也可以只在实体中拥有基本属性并通过存储库访问关系。
关于java - 如何在 Neo4J/Spring 中创建与同一实体的不同关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34591000/