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<>();
}
此外,我计划使用不同类型的注释,例如 Post
、User
、Company
等。
我是否应该创建一些接口,比如说 Commentable
并在 Post
、User
、Company
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;
}
在我的 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
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;
}