Neo4J数据模型

时间:2017-05-02 21:51:02

标签: neo4j data-modeling graph-databases spring-data-neo4j

我是Neo4J的新手,我对下面描述的问题域的最合适的数据模型有疑问。

背景

据我了解,在Neo4J中,每个关系都有各种各样的方向,传出,传入或无向。我读到新手在“双向”关系中犯下的一个常见错误是,他们可能会在两个方向上模拟关系,而实际上,一个无向关系可以很好地发挥作用。我也理解,无论方向如何,都可以在查询时忽略它并根据关系的任何一方进行查询。

问题域

这有点陈词滥调,但坚持我,在“人物”可以相互联系的图表中,我觉得很想将其模仿为一种无向的关系。但是,也许在我的问题域中,我想将元数据存储在关系边缘而不是任何一个People节点上。例如。然后连接或关系类型的时间戳(朋友,家人,雇主等......)。也许这是使用spring-data-neo4j库的“副作用”,但似乎如果我希望在边缘而不是在节点上数据元数据,我必须创建一个注释为@RelationshipEntity的类而不是@NodeEntity。这需要一个@StartNode@EndNode,这似乎意味着指向我本来无关的方向......

现在,事实证明这在我的案例中可能不是一件坏事,因为可能毕竟事实证明对于这个额外的有向上下文有一些有用的东西(例如,我想知道是谁发起了这种关系以便目标节点(人)必须接受邀请才能成为朋友。

现在想象一下,每个人都可以将“关系”放入“朋友,家人,同事”之类的“群体”中。我觉得我现在需要实际上有两个不同的边缘指向任何一个方向,以便特定于给定方向的元数据具有自然的居住地。但这似乎被描述为一种新手反模式。

问题

我有两个问题:

1)如果我需要存储特定于方向的元数据,我是否应该使用两个独立的不同关系边缘,这些边缘基本上将两种方式指向双向关系。例如Person A <--> Person B但是A人将B组放在朋友组中,而B组则将A放在同事组中。

2)鉴于下面的Java数据模型,我不清楚@Relationship Person注释的方向属性应该是什么。如果我没有指定任何内容,则默认为OUTGOING。但是,由于它是一种反思关系,取决于你看哪个人的实例,这种关系可以是传出的,也可以是传入的,例如如果人A添加人B,则两者都是人实例,但是人A实例上的方向是传出,而人B实例上的方向是传递。是否应该完全省略注释,因为我使用的是@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 个答案:

答案 0 :(得分: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以用于传入。所有这些都将在一个系列中混合使用。