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

Neo4j hierarchical comments architecture and best practices

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

我打算创建一个新的 Comment 实体,现在有几个关于解决方案设计的问题。

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

@NodeEntity
public class Comment {

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

}

此外,我计划使用不同类型的注释,例如 PostUserCompany 等。

我是否应该创建一些接口,比如说 Commentable 并在 PostUserCompany classes 中实现这个接口?

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

@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 中是否有一种方法可以通过查询数据直接获取评论树,或者它应该在代码中实现(在我的应用程序的业务逻辑中)?

您可以创建一个抽象基础 class Commentable,用 @NodeEntity 对其进行注释,然后将所有方法放入其中commentables 常见的,即 getComments 等等。 具体的评论只是扩展 Commentable,你不需要用 @NodeEntity.
进行注释 第二个问题有点模棱两可:可评论者是拥有一个根评论,还是拥有一系列根评论,每个评论都是评论树的根? 我想是后者,所以我建议 link commentables 根评论并从中访问评论树。

@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)

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

基于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;
}