繁体   English   中英

spring-data-neo4j中的数据建模

[英]data modeling in spring-data-neo4j

我的图包含称为点和线的节点。

有一个称为“ NEXT”的关系类型,它连接两个点,并具有一个称为lineID (长lineID )的属性。 线节点仅由一个ID和对“根”点的引用组成。 遍历一条线是从其根节点开始,并遵循NEXT关系,该关系的lineID与要遍历的线的ID相匹配。 澄清一下,如果我们遍历ID 123的行,其根点为ID 321,则Cypher遍历为:

 START n = node(321) 
 MATCH (n)-[rel:NEXT*{lineID:123}]->(x) 
 RETURN collect(rel)

因此,一行实际上是具有匹配lineID属性的Next关系的链接列表。 就是说,我不想将此列表作为行的属性持久化-我希望列表在加载行时由遍历构造。

在spring-data-neo4j中实现此功能有哪些选择? 具体来说,“线”是否应作为NodeEntity存在,如果存在,它们应包含什么?

@NodeEntity
class Line {
    @RelatedTo(type="ROOT")
    Point root;
    @RelatedToVia(type="NEXT") 
    Iterable<Item> list;

不太适合,因为该线没有通过“下一个”关系与该项目相关,所以根点是。 它也无法解决以下事实:那些NEXT关系需要具有与该行的ID相匹配的lineID属性(这很重要,因为某些点存在于多条线上,即它们具有多个具有不同lineID的NEXT关系)。 我有种预感,该解决方案将涉及将列表注释为@GraphTraversal,但我不知道这将如何工作。

我主要是在将头围绕于Neo4j和图数据库的背景下,来围绕SDN中的数据建模进行练习。 如果我要问的问题揭示了我对这些事情的理解上的缺陷,那么如果有人可以指出我的话,我将非常感激。

这应该是适合您的实体的模型:

@NodeEntity
class Point {
    @GraphId
    protected Long id;

    @RelatedToVia(type="NEXT")
    Set<Edge> edges;
}

@NodeEntity
class Line {
    @GraphId
    protected Long id;

    @RelatedTo(type="ROOT")
    Point root;
}

@RelationshipEntity
public class Edge  {
    @GraphId
    protected Long id;

    @StartNode private Point from;
    @EndNode private Point to;

    @RelatedTo(type="LINE")
    Line line;
}

它很容易在Java中允许两种编程式导航,如下所示:

Set edges = line.getPoint().getEdges();

for (Edge edge: edges) {
    if (edge.getLine().getId() == id) {
        ...
    }

}

或类似您列出的Cypher查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM