Spring 数据 Neo4j @RelationshipEntity 子类?
Spring Data Neo4j @RelationshipEntity subclasses?
我正在为我的第一个 Spring Data Neo4j 应用程序建模,我想知道 subclassing @RelationshipEntity classes- 1) 可以完成吗,2) 是这是个好主意吗?
这是我正在考虑使用 RSS 的示例。
一个Feed
有很多Entry
,有3种类型的条目:
- 原始条目(新内容)
- 重新记录的内容
- 喜欢的内容(实际上是堕落的转发)
Feed 可能如下所示:
@Relationship
List<Entry> entries;
其中 Liked 是 Reblog 的子class,而 Reblog 是 Entry 的子class。
鉴于 RelationshipEntities 是第一个 class 对象,这似乎更自然:
@Relationship(type="Content", Relationship.OUTGOING)
List<Entry> entries;
...
@RelationshipEntity(type="Content")
public class Content {
...
@RelationshipEntity(type="RebloggedContent")
public class RebloggedContent extends Content {
...
@RelationshipEntity(type="LikedContent")
public class LikedContent extends Content {
...
正如我所说,这是我的第一个 Neo4j 应用程序,所以我不知道这些想法是否有任何好处。
从查询的角度来看,我想询问有关 Entry
和 Entry
的特定类型(或类型组合)的问题。
感谢指向 design/modeling 想法的指针。
可以子class 关系实体,但须注意以下事项:
- 每个子 classed 关系实体必须声明一个额外的区别 属性 将其与基础 class 区分开来 - OGM 工具使用此信息进行类型自省.
示例:
这是基本关系实体的示例(使用 Kotlin JVM 语言):
abstract class Relationship
{
@GraphId
internal var graphId: Long?
private set
@StartNode
var auditioner: CandidateProfile
@EndNode
var auditionee: CandidateProfile
var createdDate: Date
init
{
this.graphId = null
this.auditioner = CandidateProfile()
this.auditionee = CandidateProfile()
this.createdDate = Date()
}
abstract fun mutualRelationship(): Relationship?
}
连同子class:
@RelationshipEntity(type = "MAYBE_LATER")
class MaybeLater constructor(auditioner: CandidateProfile,
auditionee: CandidateProfile,
timeOut: Date?) : Relationship()
{
var timeOut: Date?
var count: Int
init
{
this.auditioner = auditioner
this.auditionee = auditionee
this.timeOut = timeOut
this.count = 1
}
//Provide default constructor for OGM
constructor() : this(CandidateProfile(), CandidateProfile(), null)
override fun mutualRelationship(): MaybeLater?
{
return auditionee.maybeLaters.find { it.auditionee == auditioner }
}
}
用法:
class CandidateProfile {
@Relationship(type = "LIKES", direction = Relationship.OUTGOING)
var likes: MutableSet<Like>
@Relationship(type = "DISLIKES", direction = Relationship.OUTGOING)
var dislikes: MutableSet<Dislike>
@Relationship(type = "MAYBE_LATER", direction = Relationship.OUTGOING)
var maybeLaters: MutableSet<MaybeLater>
}
请注意,我们为每个单独的关系类型定义了一个集合。如果需要单个聚合集合,则需要在代码中完成。
Neo4j 用户 Slack 频道:
除了 Whosebug 之外,Neo4j 社区还通过 Neo4j Users public Slack channel 提供支持 - 强烈建议加入。
我正在为我的第一个 Spring Data Neo4j 应用程序建模,我想知道 subclassing @RelationshipEntity classes- 1) 可以完成吗,2) 是这是个好主意吗?
这是我正在考虑使用 RSS 的示例。
一个Feed
有很多Entry
,有3种类型的条目:
- 原始条目(新内容)
- 重新记录的内容
- 喜欢的内容(实际上是堕落的转发)
Feed 可能如下所示:
@Relationship
List<Entry> entries;
其中 Liked 是 Reblog 的子class,而 Reblog 是 Entry 的子class。
鉴于 RelationshipEntities 是第一个 class 对象,这似乎更自然:
@Relationship(type="Content", Relationship.OUTGOING)
List<Entry> entries;
...
@RelationshipEntity(type="Content")
public class Content {
...
@RelationshipEntity(type="RebloggedContent")
public class RebloggedContent extends Content {
...
@RelationshipEntity(type="LikedContent")
public class LikedContent extends Content {
...
正如我所说,这是我的第一个 Neo4j 应用程序,所以我不知道这些想法是否有任何好处。
从查询的角度来看,我想询问有关 Entry
和 Entry
的特定类型(或类型组合)的问题。
感谢指向 design/modeling 想法的指针。
可以子class 关系实体,但须注意以下事项:
- 每个子 classed 关系实体必须声明一个额外的区别 属性 将其与基础 class 区分开来 - OGM 工具使用此信息进行类型自省.
示例:
这是基本关系实体的示例(使用 Kotlin JVM 语言):
abstract class Relationship
{
@GraphId
internal var graphId: Long?
private set
@StartNode
var auditioner: CandidateProfile
@EndNode
var auditionee: CandidateProfile
var createdDate: Date
init
{
this.graphId = null
this.auditioner = CandidateProfile()
this.auditionee = CandidateProfile()
this.createdDate = Date()
}
abstract fun mutualRelationship(): Relationship?
}
连同子class:
@RelationshipEntity(type = "MAYBE_LATER")
class MaybeLater constructor(auditioner: CandidateProfile,
auditionee: CandidateProfile,
timeOut: Date?) : Relationship()
{
var timeOut: Date?
var count: Int
init
{
this.auditioner = auditioner
this.auditionee = auditionee
this.timeOut = timeOut
this.count = 1
}
//Provide default constructor for OGM
constructor() : this(CandidateProfile(), CandidateProfile(), null)
override fun mutualRelationship(): MaybeLater?
{
return auditionee.maybeLaters.find { it.auditionee == auditioner }
}
}
用法:
class CandidateProfile {
@Relationship(type = "LIKES", direction = Relationship.OUTGOING)
var likes: MutableSet<Like>
@Relationship(type = "DISLIKES", direction = Relationship.OUTGOING)
var dislikes: MutableSet<Dislike>
@Relationship(type = "MAYBE_LATER", direction = Relationship.OUTGOING)
var maybeLaters: MutableSet<MaybeLater>
}
请注意,我们为每个单独的关系类型定义了一个集合。如果需要单个聚合集合,则需要在代码中完成。
Neo4j 用户 Slack 频道:
除了 Whosebug 之外,Neo4j 社区还通过 Neo4j Users public Slack channel 提供支持 - 强烈建议加入。