为什么 neo4j-ogm 不保存与嵌入式 neo4j 数据库的关系?
Why neo4j-ogm not saves relations to embedded neo4j-database?
我试图获得一个嵌入式 tomcat-server 的工作系统,带有 spring-boot、joinfaces 和嵌入式 neo4j-graph-database with the object-mapping ogm. Everything seems to work fine. I commit my sources to https://svn.riouxsvn.com/circlead-embedd/circlead-embedded/
问题是所有 neo4j-ogm-examples (see i.e. http://www.hascode.com/2016/07/object-graph-mapping-by-example-with-neo4j-ogm-and-java/) 都表明 @Relationship 与 ogm 一起工作。但是当我用
测试它时
@NodeEntity
public abstract class GenericNode<T> implements INode<T> {
@GraphId
public Long id;
@SuppressWarnings("unused")
private void setId(Long id) {
this.id = id;
}
public String label;
@Relationship(type = "PARENT_OF", direction = Relationship.INCOMING)
public Set<T> parents = new HashSet<T>();
@Relationship(type = "CHILD_OF", direction = Relationship.OUTGOING)
public Set<T> children = new HashSet<T>();
...
那么所有的关系好像都没有写入数据库,因为行
Role rp = new Role("Role 1");
Role rc = new Role("Role 2");
rc.addParent(rp);
session.save(rc);
Iterable<Role> roles = session.query(Role.class, "MATCH (x) RETURN x;", Collections.<String, Object>emptyMap());
for (Role role : roles) {
System.out.println(role);
}
控制台显示缺少数据库关系。似乎只有在活动会话中才能找到关系。服务器重启后,所有关系都丢失了。
Role [id=52, label=Role 2, parents=[]]
Role [id=53, label=Role 1, parents=[]]
Role [id=54, label=Role 1, parents=[]]
Role [id=55, label=Role 2, parents=[54]]
我不知道这种错误是怎么发生的。我使用 neo4j-ogm 2.1.2 和 neo4j 3.1.3.
有什么想法吗?
您看到的结果是预期的 - neo4j-ogm 映射您 return 在您的密码查询中的内容(加上您在会话中已有的内容)。如果您还想要相关实体,那么 return 关系和其他节点:
MATCH (x)-[r]-(x2) RETURN x,r,x2
或者如果你想要,例如只有父字段水合:
MATCH (x)<-[r:PARENT_OF]-(p) RETURN x,r,p
这只会在第一层补水。要混合所有级别(父级的父级),您需要使用可变长度路径和 return 它的节点和关系(return 直接路径不能可靠地工作):
MATCH p=(x)-[:PARENT_OF*..]-() RETURN nodes(p),rels(p)
我试图获得一个嵌入式 tomcat-server 的工作系统,带有 spring-boot、joinfaces 和嵌入式 neo4j-graph-database with the object-mapping ogm. Everything seems to work fine. I commit my sources to https://svn.riouxsvn.com/circlead-embedd/circlead-embedded/
问题是所有 neo4j-ogm-examples (see i.e. http://www.hascode.com/2016/07/object-graph-mapping-by-example-with-neo4j-ogm-and-java/) 都表明 @Relationship 与 ogm 一起工作。但是当我用
测试它时@NodeEntity
public abstract class GenericNode<T> implements INode<T> {
@GraphId
public Long id;
@SuppressWarnings("unused")
private void setId(Long id) {
this.id = id;
}
public String label;
@Relationship(type = "PARENT_OF", direction = Relationship.INCOMING)
public Set<T> parents = new HashSet<T>();
@Relationship(type = "CHILD_OF", direction = Relationship.OUTGOING)
public Set<T> children = new HashSet<T>();
...
那么所有的关系好像都没有写入数据库,因为行
Role rp = new Role("Role 1");
Role rc = new Role("Role 2");
rc.addParent(rp);
session.save(rc);
Iterable<Role> roles = session.query(Role.class, "MATCH (x) RETURN x;", Collections.<String, Object>emptyMap());
for (Role role : roles) {
System.out.println(role);
}
控制台显示缺少数据库关系。似乎只有在活动会话中才能找到关系。服务器重启后,所有关系都丢失了。
Role [id=52, label=Role 2, parents=[]]
Role [id=53, label=Role 1, parents=[]]
Role [id=54, label=Role 1, parents=[]]
Role [id=55, label=Role 2, parents=[54]]
我不知道这种错误是怎么发生的。我使用 neo4j-ogm 2.1.2 和 neo4j 3.1.3.
有什么想法吗?
您看到的结果是预期的 - neo4j-ogm 映射您 return 在您的密码查询中的内容(加上您在会话中已有的内容)。如果您还想要相关实体,那么 return 关系和其他节点:
MATCH (x)-[r]-(x2) RETURN x,r,x2
或者如果你想要,例如只有父字段水合:
MATCH (x)<-[r:PARENT_OF]-(p) RETURN x,r,p
这只会在第一层补水。要混合所有级别(父级的父级),您需要使用可变长度路径和 return 它的节点和关系(return 直接路径不能可靠地工作):
MATCH p=(x)-[:PARENT_OF*..]-() RETURN nodes(p),rels(p)