在我的Spring Boot / Neo4j应用程序中,我有一个很大的Neo4j节点树,现在我想为每个节点实现分层注释。
我计划创建一个新的Comment
实体,现在就解决方案设计提出一些问题。
我的应用程序中的注释必须是分层的,所以我打算创建这样的东西:
@NodeEntity
public class Comment {
@RelatedTo(type = CONTAINS, direction = Direction.OUTGOING)
private Set<Decision> childComments = new HashSet<>();
}
此外,我计划针对不同类型使用评论,例如Post
,User
,Company
等等。
我应该创建一些界面,让我们说Commentable
并在Post
,User
,Company
类中实现此界面吗?
如果是这样,就可以使用这个界面(不是
我@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中是否有通过查询数据直接获取注释树的方法,或者它应该在代码中实现(在我的应用程序的业务逻辑中)?
答案 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;
}