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

时间:2016-01-04 12:18:42

标签: java spring neo4j spring-data-neo4j

我在Spring Boot v1.3.1中使用Spring Data Neo4J。我的Neo4J版本是2.1.6。 让我们说,我有一个实体人,可以有一个名为Friend的关系与一组人。因此,我将Set定义为实体的属性之一,使用@RelatedTo注释并为其指定名为Friend的类型。

如果我想拥有多个其他关系,仅使用相同的实体,请说,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. 创建Person节点。(花费大量时间)

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

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

    一种方法是在保存一定数量的节点后提交事务。 我跟着这个link 我不确定性能提升,因为调用neo4jTemplate.save()仍然需要大约500毫秒。

    从我的日志中:

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

    这应该没事吗?

    另一种方法是使用Cypher,正如迈克尔在他的博客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}))
    

    此方法的问题是批量创建节点,但忽略name属性上的唯一索引。看来,我必须在保存每个节点后提交。

    那么,还有其他方法,我可以更快地批量创建节点吗?

1 个答案:

答案 0 :(得分:0)

您可以通过创建不同类型的关系实体来处理它。

或直接使用Get-EventLog -LogName * -After (Get-Date).Adddays(-7) | Select-Object @{n='MachineName';e={$env:COMPUTERNAME}}, Log, @{n='Entries';e={$_.Entries.Count}} | Export-Csv "C:\temp\$env:COMPUTERNAME.csv" -NoType Neo4jTemplate)。

如果您有这样的动态设置,您的实体会是什么样的?

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