我的图表包含称为点和线的节点。
有一种名为“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/