我在Spring Boot v1.3.1中使用Spring Data Neo4J。我的Neo4J版本是2.1.6。
让我们说,我有一个实体人,可以有一个名为Friend
的关系与一组人。因此,我将Set
定义为实体的属性之一,使用@RelatedTo
注释并为其指定名为Friend
的类型。
如果我想拥有多个其他关系,仅使用相同的实体,请说,Enemy
,Acquaintance
等等。我是否必须为所有人定义,分隔属性他们?我不能动态传递这种关系吗?
供参考:
@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
或Enemy
时,我希望使用具有唯一名称的人创建它们。
因此,将有两个步骤:
创建Person节点。(花费大量时间)
创建它们之间的关系。(不需要太多时间,大约30-40毫秒)
我尝试了批量创建节点的不同方法。
一种方法是在保存一定数量的节点后提交事务。
我跟着这个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属性上的唯一索引。看来,我必须在保存每个节点后提交。
那么,还有其他方法,我可以更快地批量创建节点吗?
答案 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
)。
如果您有这样的动态设置,您的实体会是什么样的?
您不必列出实体中的关系。如果它们是动态的,您还可以在实体中拥有基本属性,并通过存储库访问关系。