关于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。

有什么想法吗?


您看到的结果是预期的——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)