关于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
    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 >();

    ...

那么所有关系似乎都没有写入数据库,因为行

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) {
        System.out.println(role);
    }

在控制台中显示缺少数据库的关系。似乎只有在活动的会话关系中才能找到。服务器重新启动后,所有关系都丢失了。

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 查询中的急切获取。
  • 谢谢,你的回答有帮助,但告诉我我有很多工作来构建一个带有数据库接口的定义数据模型。

以上是关于java:为什么neo4j-ogm 不将关系保存到嵌入式neo4j-数据库?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>