我是Neo4J的新手,我对下面描述的问题域的最合适的数据模型有疑问 .
背景
据我了解,在Neo4J中,每个关系都有各种各样的方向,传出,传入或无向 . 我读到新手在“双向”关系中犯下的一个常见错误是,他们可能会在两个方向上 Build 关系模型,实际上,一个无向关系可以很好地发挥作用 . 我也明白,无论方向如何,都可以在查询时忽略它并根据关系的任何一方进行查询 .
问题域
这有点陈词滥调,但坚持我,在一个图表中"People"可以相互连接,我觉得很想把它模仿为一个无向的关系 . 但是,也许在我的问题域中,我希望将元数据存储在关系边缘而不是任何一个People节点上 . 例如 . 然后连接或关系类型的时间戳(朋友,家人,雇主等......) . 也许这是使用spring-data-neo4j库的"side effect"但似乎如果我希望在边缘而不是在节点上数据元数据,我必须创建一个注释为 @RelationshipEntity
而不是 @NodeEntity
的类 . 这需要一个 @StartNode
和 @EndNode
,这似乎意味着我的方向与我无关的关系......
现在,事实证明这在我的案例中可能不是一件坏事,因为可能毕竟事实证明这个额外的有向上下文有一些有用的东西(例如,我想知道是谁发起了这个关系,以便目标节点(人) )必须接受邀请成为朋友) .
现在想象一下,每个人都可以将“关系”放入“朋友,家人,同事”等“群体”中 . 我觉得我现在需要实际上有两个不同的边缘,指向任一方向,以便特定的元数据到了给定的方向有一个自然的居住地 . 但这似乎被描述为一种新手反模式 .
问题
我有两个问题:
1)如果我需要存储特定于方向的元数据,我是否应该使用两个独立的不同关系边缘,这些边缘基本上将任一方式指向双向关系 . 例如 Person A <--> Person B
但是人A在朋友组中放置了人B,而人B在同事组中放置了A.
2)鉴于下面的Java数据模型,我不清楚 Person
注释的方向属性应该是什么 . 如果我没有指定任何内容,则默认为 OUTGOING
. 但是因为's a reflective relationship depending on which person instance you look at the relationship could be either outgoing or incoming, e.g. if person A adds person B, both are Person instances, but the direction is outgoing on the person A instance and incoming on the person B instance. Should the annotation be omitted altogether since I'米使用 @RelationshipEntity
?
Java数据模型
@NodeEntity
@EqualsAndHashCode(of = {"id"})
@NoArgsConstructor
public abstract class Person {
@GraphId
private Long id;
... other attributes
@Relationship(type = "CONNECTION_OF", direction = UNDIRECTED)
private Set<Connection> connections;
}
@Data
@RelationshipEntity(type = "CONNECTION_OF")
public class Connection {
@GraphId
private Long relationshipId;
... other meta-data
@StartNode
private Person from;
@EndNode
private Person to;
}
1 回答
1)运作良好的经验法则是回答一个问题 - 如果存在从A到B的关系,是否仍然可以创建具有不同元数据的从B到A的另一个关系?你可以独立删除另一个方向吗?
如果答案是肯定的,他们会选择两个直接关系,否则请使用
UNDIRECTED
,并创建initiatedBy=userId
属性或类似关系 .对于你将连接分组的情况 - 问题是你真的将人们从另一个人的角度分类,也许这是一个完全不同的事实,独立于
CONNECTED_TO
关系?你可以,例如创建一个组节点,并使用以下模式将其链接到所有者和组中的所有人:
2)保持
@Relationship(type = "CONNECTION_OF", direction = UNDIRECTED)
. 对于给定的人X,connections
Set将具有来自= X的元素,用于传出边缘,其中元素必须为= X以用于传入 . 所有这些都将混合在一个系列中 .