java - 如何在 Neo4J/Spring 中创建与同一实体的不同关系?

标签 java spring neo4j spring-data-neo4j

我正在将 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 ”或“敌人”时,我希望使用具有唯一名称的人来创建它们。 因此,将有两个步骤:

  1. 创建 Person 节点。(需要大量时间)

  2. 创建它们之间的关系。(不需要太多时间,大约 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/

相关文章:

java - 使用 Java 反射返回所有 null

java - 在java中嵌入wav?

java - android 如何将图像保存在特定文件夹中

java - 算法逻辑

java - hashcode/equals 的正确实现

java - 在 java 类中处理 JSP (Spring MVC)

java - 无法使用具有 2 个 spring 上下文的存储库和服务

docker - neo4j和.NetCore Docker设置

java - 无法在 Neo4j JAVA 中执行密码匹配查询

javascript - 使用 neo4j-driver 获取 neo4j 中所有连接的 Node