首页 文章

Neo4J数据模型

提问于
浏览
2

我是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

    1)运作良好的经验法则是回答一个问题 - 如果存在从A到B的关系,是否仍然可以创建具有不同元数据的从B到A的另一个关系?你可以独立删除另一个方向吗?

    如果答案是肯定的,他们会选择两个直接关系,否则请使用 UNDIRECTED ,并创建 initiatedBy=userId 属性或类似关系 .

    对于你将连接分组的情况 - 问题是你真的将人们从另一个人的角度分类,也许这是一个完全不同的事实,独立于 CONNECTED_TO 关系?

    你可以,例如创建一个组节点,并使用以下模式将其链接到所有者和组中的所有人:

    (:Person)-[:OWNS]-(:Group)-[:CATEGORIZED]-(:Person)
    

    2)保持 @Relationship(type = "CONNECTION_OF", direction = UNDIRECTED) . 对于给定的人X, connections Set将具有来自= X的元素,用于传出边缘,其中元素必须为= X以用于传入 . 所有这些都将混合在一个系列中 .

相关问题