Neo4j分层评论架构和最佳实践

时间:2015-09-26 18:12:23

标签: neo4j cypher spring-data-neo4j

在我的Spring Boot / Neo4j应用程序中,我有一个很大的Neo4j节点树,现在我想为每个节点实现分层注释。

我计划创建一个新的Comment实体,现在就解决方​​案设计提出一些问题。

我的应用程序中的注释必须是分层的,所以我打算创建这样的东西:

@NodeEntity
public class Comment {

    @RelatedTo(type = CONTAINS, direction = Direction.OUTGOING)
    private Set<Decision> childComments = new HashSet<>();

}

此外,我计划针对不同类型使用评论,例如PostUserCompany等等。

我应该创建一些界面,让我们说Commentable并在PostUserCompany类中实现此界面吗?

如果是这样,就可以使用这个界面(不是 我@NodeEntity课程中的Comment}?例如:

@NodeEntity
public class Comment {

    @RelatedTo(type = CONTAINS, direction = Direction.OUTGOING)
    private Set<Decision> childComments = new HashSet<>();

    @RelatedTo(type = CONTAINS, direction = Direction.INCOMING)
    Commentable owner;

}

此外,如果每条评论都知道其所有者,那么如何确定某个节点的第一条评论(特定Commentable节点的评论树的根元素)?也许是通过评论创建日期?

在Neo4j / Cypher / SDN中是否有通过查询数据直接获取注释树的方法,或者它应该在代码中实现(在我的应用程序的业务逻辑中)?

2 个答案:

答案 0 :(得分:1)

您可以创建一个抽象基类可注释,使用 @NodeEntity 对其进行注释,并添加所有可注释的方法,即 getComments < / em>等等。 具体的评论只是扩展可评论的,您不需要使用 @NodeEntity 进行注释。
第二个问题有点含糊不清:评论是否拥有一个单一的根评论,或者他们是否拥有根评论列表,每个评论都是评论树的根? 我想后者,所以我建议将评论链接到根评论并从中查看评论树。

@NodeEntity
public abstract class Commentable {

    @RelatedTo(type = COMMENTABLE_COMMENTS, direction = Direction.BOTH)
    private Set<Comment> comments = new HashSet<>();

}

@NodeEntity
public class Comment {

    @RelatedTo(type = CHILD_COMMENTS, direction = Direction.OUTGOING)
    private Set<Comment> childComments = new HashSet<>();

    @RelatedTo(type = COMMENTABLE_COMMENTS, direction = Direction.BOTH)
    Commentable owner;

}

您可以使用如下查询获取给定的评论树:

MATCH (comment {key: {value}})-[:CHILD_COMMENTS*]->(child)

我假设你已经提取了根评论,并且评论有一些关键属性来唯一地标识它们。

答案 1 :(得分:0)

根据 remigio 回答,我稍微改进了解决方案:

@NodeEntity
public abstract class Commentable {

    @RelatedTo(type = COMMENTED_ON, direction = Direction.INCOMING)
    private Set<Comment> comments = new HashSet<>();

}

@NodeEntity
public class Comment extends Commentable {

    @RelatedTo(type = COMMENTED_ON, direction = Direction.OUTGOING)
    private Commentable commentable;

    private String text;
}