要使用neo4j-graphdatabase独立服务器,我将SDN 4.0.0.RC1的依赖项添加到我的pom:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>4.0.0.RC1</version>
<exclusions>
<exclusion>
<groupId>org.neo4j.app</groupId>
<artifactId>neo4j-server</artifactId>
</exclusion>
</exclusions>
</dependency>
在我的应用程序中,我想管理家庭。人为NodeEntities,关系类型为NodeEntities,家庭关系为RelationshipEntities。
要保存节点或关系,请使用repository.save(T t) (repository extends GraphRepository<T>)
。这适用于所有节点,但不适用于关系。
显式无效代码:
Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
createdRelation.setBegin(begin);
createdRelation.setEnd(end);
Relation relation = relationRepository.save(createdRelation);
我从save(T t)返回一个Relation-Object。 但是RelationshipEntity不会在图形数据库中保留。我的Relation-Object也没有任何id。
RelationshipEntity类如下所示:
@RelationshipEntity(type = "RELATION")
public class Relation extends BaseMutableGraphEntity {
@Property
private String type;
@StartNode
private Person fromPerson;
@EndNode
private Person toPerson;
private Relation() {
}
...getters and setters...}
graph-id保存在BaseClass中:
public abstract class BaseGraphEntity implements AuditEntity {
@GraphId
private Long id;
...with getters and setters...}
我现在的问题是:
如何使用Spring Data Neo4j 4 RC1保存我的RelationshipEntities?
RelationshipEntities还有其他存储库吗?
P.S。:我试图将我的graph-id的位置更改为主要的RelationshipEntity,但它不起作用。
答案 0 :(得分:2)
我也遇到了这个怪癖,能够通过以下方式坚持我的关系:
@StartNode
实体@StartNode
实体或@RelationshipEntity
,似乎关键是必须首先在@StartNode
上设置对象因此,在您的示例中,您必须执行以下操作:
Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
createdRelation.setBegin(begin);
createdRelation.setEnd(end);
begin.setRelation(createdRelation);
Relation relation = relationRepository.save(createdRelation);
所有人都说我必须承认,我不能100%确定这是否是它要完成的方式,因为在当前的文档修订中并不清楚但是它似乎确实是在SDN4示例测试:
this CodePen(见findOneShouldConsiderTheEntityType
)
答案 1 :(得分:2)
您所看到的是对象图(您的域模型)与您期望的实际图形不对应的事实。
Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
createdRelation.setBegin(begin);
createdRelation.setEnd(end);
Relation relation = relationRepository.save(createdRelation);
这里,关系实体正确地表示与起始节点和结束节点的关系。现在,如果你试图导航这个&#34;对象图&#34;到开始实体,即begin
,您发现无法通过关系导航到最终实体end
。
当实体被持久化时,遍历对象图以确定新内容或修改内容并保留它们。在这种情况下,当遍历到达您的起始节点时,它找不到与其他节点的关系,并且实际上,应该创建的这种关系不是。
Simon的代码之所以有效,是因为他使实体图与物理图形一致。然后,您可以保存最后的实体或关系实体本身。
如果您根据图形来考虑对象,那么这一切都将落实到位。
答案 2 :(得分:0)
这是解决我问题的代码,谢谢 simonl !
Relation relation = new Relation(typeName, from, to, getCurrentUsername());
relation.setBegin(begin);
relation.setEnd(end);
from.addOutgoingRelation(relation);
personRepository.save(from);
return createResponseBuilder.build(relation);
...我将我的代码更改为
Relation relation = new Relation(typeName, from, to, getCurrentUsername());
relation.setBegin(begin);
relation.setEnd(end);
from.addOutgoingRelation(relation);
return createResponseBuilder.build(relationRepository.save(relation));
由于 Luannes 的评论,谢谢你!