有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

springdataneo4j中的java数据建模

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

有一种称为“NEXT”的关系类型,它连接两个点,并有一个名为lineID(long)的属性。线节点仅由ID和对“根”点的引用组成。要遍历一条线,就要从它的根节点开始,并遵循其lineID与被遍历线的id匹配的下一个关系。为了澄清,如果我们正在遍历ID为123的行,其根点的ID为321,那么密码遍历将是:

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

因此,一行本质上是具有匹配lineID属性的下一个关系的链接列表。也就是说,我不想将这个列表作为行的属性来持久化——我希望在加载行时通过遍历来构造列表

我在spring-data-neo4j中实现这一点的选项是什么?具体来说,“行”应该以NodeEntity的形式存在吗?如果是,它们应该包含什么

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

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

我这样做主要是为了练习如何在SDN中进行数据建模,在一般情况下,我将学习Neo4j和图形数据库。如果我问的问题显示出我对这些事情的理解有缺陷,如果有人能指出,我将不胜感激


共 (1) 个答案

  1. # 1 楼答案

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

    @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) {
            ...
        }
    

    }

    或者像您列出的那样的密码查询