java - spring-data-neo4j 中的数据建模

标签 java spring neo4j spring-data spring-data-neo4j

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

有一种名为“NEXT”的关系类型,它连接两个点并具有一个名为 lineID(长整型)的属性。线节点仅由 ID 和对“根”点的引用组成。遍历一条线就是从它的根节点开始,遵循 lineID 与正在遍历的线的 id 匹配的 NEXT 关系。澄清一下,如果我们遍历 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,但我不明白这是如何工作的。

我这样做主要是为了让我对 SDN 中的数据建模有所了解,同时也让我对 Neo4j 和图形数据库有所了解。如果我提出的问题揭示了我对这些事情的理解存在缺陷,如果有人能够指出它,我将非常感激。

最佳答案

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

@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 查询。

关于java - spring-data-neo4j 中的数据建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21895605/

相关文章:

neo4j - 为长但(几乎)唯一的路径寻求 Neo4J Cypher 查询

python - Py2neo:查找关系并返回节点

java - java聊天客户端程序有没有办法动态查找主机服务器?

java - 如何将 Spring MVC 重定向到类似 url 的 {...}

java - 这个 NumberFormatException 是什么意思?

spring - 如何在 Freemarker 模板中访问 Spring 应用程序属性?

java - 数据未插入到 Spring-Hibernate-envers webapp 中的审计表中

java - Neo4j 令人震惊的写入性能

java - 查找类的特定实例?

java - EmbeddedChannel 和 ChannelActive