关系@EndNode的通用性

时间:2016-02-18 10:14:12

标签: neo4j neo4j-ogm

我有一个名为“AUTHORED”的关系,此关系会链接UserTipCommentBuild

为了避免为每个关系的endnode类型创建一个类,我决定编写一个通用的Authored类:

@RelationshipEntity(type="AUTHORED")
public class Authored<T> {

    @GraphId Long id;

    @StartNode
    private User author;

    @EndNode
    private T entity;

    private Long date;

    public User getAuthor() {
        return author;
    }

    public T getEntity() {
        return entity;
    }

    public Long getDate() {
        return date;
    }

    public void setDate(Long date) {
        this.date = date;
    }
}

以下是我的User类的一部分:

@NodeEntity
public class User extends Entity{

    private String firstName;

    private String lastName;

    private String ign;

    @JsonIgnore
    private String password;

    private String email;

    @Relationship(type="AUTHORED", direction="OUTGOING")
    @JsonIgnore private Set<Authored<Tip>> tips = new HashSet<Authored<Tip>>();

    public Set<Tip> getTips() {
        Set<Tip> tips = new HashSet<Tip>();
        this.tips.forEach((t) -> {
            tips.add(t.getEntity());
        });
        return tips;
    }
...
...

问题在于我得到RunTimeException

java.lang.RuntimeException: Cannot find a writer for the EndNode of relational entity com.bnstips.api.database.model.relation.Authored
    at org.neo4j.ogm.context.GraphEntityMapper.createRelationshipEntity(GraphEntityMapper.java:340) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at org.neo4j.ogm.context.GraphEntityMapper.mapRelationshipEntity(GraphEntityMapper.java:280) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at org.neo4j.ogm.context.GraphEntityMapper.mapRelationships(GraphEntityMapper.java:243) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at org.neo4j.ogm.context.GraphEntityMapper.mapEntities(GraphEntityMapper.java:143) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:117) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at org.neo4j.ogm.context.GraphEntityMapper.map(GraphEntityMapper.java:81) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:48) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at org.neo4j.ogm.session.Neo4jSession.load(Neo4jSession.java:82) ~[neo4j-ogm-core-2.0.0-M02.jar:na]
    at com.bnstips.api.database.GenericService.find(GenericService.java:22) ~[classes/:na]
    at com.bnstips.api.endpoint.UserEndpoint.getUserTips(UserEndpoint.java:33) ~[classes/:na]
...........
...........     

那么,是否真的可以创建通用关系?我做错了吗?

编辑:如果这不可能,我应该为每个Authored endnode类型创建一个classe,还是应该创建3个关系,每个创作的endnode类型一个(AUTHORED_TIPAUTHORED_COMMENT和{{1} })。

1 个答案:

答案 0 :(得分:1)

不支持通用的Authored。你的两种选择都有效。

您可以为每个端节点类型设置特定的关系类型,因此使用不同关系类型(AUTHORED_TIPAUTHORED_COMMENTAUTHORED_BUILD注释的三个关系实体类。

或者,如果您的模型更好地认为,请使用相同的关系类型。您仍然需要三个关系实体类,但使用相同的关系类型(AUTHORED)注释它们。这方面的一个示例是Pizza类,它引用了由相同关系HAS - PizzaSeasoningPizzaCheese

表示的两个关系实体

请注意,对于上述两个选项,您的开始/结束节点都是特定的,不使用泛型。