关于java:为什么neo4j-ogm 不将关系保存到嵌入式neo4j-数据库?
Why neo4j-ogm not saves relations to embedded neo4j-database?
我试图获得一个带有 spring-boot、joinfaces 和带有对象映射 ogm 的嵌入式 neo4j-graph-database 的嵌入式 tomcat 服务器的工作系统。一切似乎都很好。我将我的资源提交给 https://svn.riouxsvn.com/circlead-embedd/circlead-embedded/
问题在于所有 neo4j-ogm-examples(参见 http://www.hascode.com/2016/07/object-graph-mapping-by-example-with-neo4j-ogm-and-java/ ) 表明@Relationship 与 ogm 一起使用。但是当我用
测试它时
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@NodeEntity
public abstract class GenericNode< T > implements INode< T > { @GraphId @SuppressWarnings("unused") public String label; @Relationship(type ="PARENT_OF", direction = Relationship.INCOMING) @Relationship(type ="CHILD_OF", direction = Relationship.OUTGOING) ... |
那么所有关系似乎都没有写入数据库,因为行
|
1
2 3 4 5 6 7 8 9 |
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) { |
在控制台中显示缺少数据库的关系。似乎只有在活动的会话关系中才能找到。服务器重新启动后,所有关系都丢失了。
|
1
2 3 4 |
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。
有什么想法吗?
相关讨论
- 另请注意,您将在父子之间有 2 种关系 - PARENT_OF 和 CHILD_OF - 这通常是建模错误,1 个关系就足够了。关系的方向应该告诉你语义——什么是父母,什么是孩子。
您看到的结果是预期的——neo4j-ogm 映射了您在密码查询中返回的内容(加上您在会话中已有的内容)。如果您还想要相关实体,则返回关系和其他节点:
|
1
|
MATCH (x)-[r]-(x2) RETURN x,r,x2
|
或者如果你想要,例如只有父字段水合:
|
1
|
MATCH (x)<-[r:PARENT_OF]-(p) RETURN x,r,p
|
这只会给第一级补水。要水合所有级别(父级的父级),您需要使用可变长度路径并返回其节点和关系(直接返回路径不可靠):
|
1
|
MATCH p=(x)-[:PARENT_OF*..]-() RETURN nodes(p),rels(p)
|
相关讨论
- 你能提供一个工作的例子吗?因为当我使用 `org.neo4j.ogm.model.Result result = session.query("MATCH (x)-[r]-(x2) RETURN x,r,x2", Collections.<String, Object>emptyMap( ), true);\t\t for (Map<String, Object> map : result) { System.out.println("C" map.get("x")); System.out.println("R" map.get("r")); System.out.println("P" map.get("x2")); }`
- 我得到 C 角色 [id=3, label=Role 2, parents=[]] R (2)-[PARENT_OF]->(3) P Role [id=2, label=Role 1, parents=[]] C角色 [id=4, label=Role 2, parents=[5]] R (5)-[CHILD_OF]->(4) P Role [id=5, label=Role 1, parents=[]]
- 旁注:当没有真正的映射并且我需要针对不同对象值的特殊查询时,OGM 有什么用。有没有办法像在hibernate或jpa中那样获得真正的映射?
- 请参阅文档 neo4j.com/docs/ogm-manual/current/reference/... 的这一部分或例如此博客文章 graphaware.com/neo4j/2016/04/06/mapping-query-entities-sdn.h??tml 为示例。当您使用 session.loadX 方法时,会发生像 jpa 中的映射,没有延迟获取的概念,这就是为什么在需要更具体获取什么的情况下存在查询方法的原因,类似于 jpa 查询中的急切获取。
- 谢谢,你的回答有帮助,但告诉我我有很多工作来构建一个带有数据库接口的定义数据模型。