【问题标题】:Why neo4j-ogm not saves relations to embedded neo4j-database?为什么 neo4j-ogm 不保存与嵌入式 neo4j 数据库的关系?
【发布时间】:2017-05-17 20:39:31
【问题描述】:

我试图获得一个带有 spring-boot、joinfaces 和嵌入式 neo4j-graph-database 和对象映射 ogm 的嵌入式 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 一起使用。但是当我用

测试它时
@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。

有什么想法吗?

【问题讨论】:

  • 另请注意,您将在父母和孩子之间有 2 种关系 - PARENT_OFCHILD_OF - 这通常是一个建模错误,1 个关系就足够了。关系的方向应该告诉你语义——什么是父母,什么是孩子。

标签: java spring-boot neo4j neo4j-ogm


【解决方案1】:

您看到的结果是预期的 - neo4j-ogm 映射了您在密码查询中返回的内容(加上您在会话中已经拥有的内容)。如果您还想要相关实体,则返回关系和其他节点:

MATCH (x)-[r]-(x2) RETURN x,r,x2

或者如果你想要,例如只有父字段水合:

MATCH (x)<-[r:PARENT_OF]-(p) RETURN x,r,p

这只会为第一级补水。要水合所有级别(父级的父级),您需要使用可变长度路径并返回其节点和关系(直接返回路径不能可靠地工作):

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.emptyMap( ), 真的); for (Map 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 角色 [id=2, label=Role 1, parents=[]] C Role [id=4, label=Role 2, parents=[5]] R (5)-[CHILD_OF]->(4) P Role [id=5, label=Role 1,父母=[]]
  • 旁注:当没有真正的映射并且我需要针对不同对象值的特定查询时,OGM 有什么用。有没有办法像在 hibernate 或 jpa 中那样获得真正的映射?
  • 查看这部分文档neo4j.com/docs/ogm-manual/current/reference/… 或例如这篇博文graphaware.com/neo4j/2016/04/06/mapping-query-entities-sdn.html 的例子。当您使用 session.loadX 方法时,会发生像 jpa 中的映射,没有延迟获取的概念,这就是为什么在您需要更具体地获取什么的情况下存在查询方法的原因,类似于 jpa 查询中的 eager fetch。跨度>
  • 谢谢,您的回答有帮助,但表明我有很多工作要建立一个带有数据库接口的已定义数据模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多