【问题标题】:Genericity on Relationship @EndNode关系@EndNode 的泛型性
【发布时间】:2016-02-18 10:14:11
【问题描述】:

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

为了避免为每个关系端节点类型创建一个类,我决定编写一个通用的 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;
    }
}

这是我的用户类的一部分:

@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]
...........
...........     

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

编辑:如果这是不可能的,我应该为每个已创建的端节点类型创建一个类,还是应该创建 3 个关系,每个已创建的端节点类型(AUTHORED_TIPAUTHORED_COMMENTAUTHORED_BUILD)。

【问题讨论】:

  • 我认为具体的关系是更好的建模方法和要走的路。

标签: neo4j neo4j-ogm


【解决方案1】:

不支持通用 Authored。您的两种选择都可以。

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

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

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

【讨论】:

  • 目前我使用继承来管理我的关系,并使用entity.getClass() 过滤关系类型。由于在我的情况下每个模型都扩展了Entity&lt;T&gt;,所以它可以工作。但我想我会创造不同的关系。如果我用不同的@EndNode 创建三个关系,Neo4j 会获取每个AUTHORED 关系然后按@EndNode 过滤吗?因为如果是这样,我将不得不创建三种不同的关系类型,以提高性能。
  • 在当前版本的 OGM 中,在任何情况下都将获取附加到实体的所有关系,因此性能将是相同的。在未来的版本中,OGM 将仅获取通过您的域模型公开的关系,因此如果您仅定义 AUTHORED_COMMENT 则只会获取该关系。但是如果你定义了所有三个,那么再次,没有性能提升,因为所有 3 都将被获取。尚无计划仅支持获取特定关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2011-09-29
  • 2012-03-20
  • 2011-01-17
  • 2017-11-18
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多