我一直试图使用neo4j实体来表示有向图。使用spring-data-neo4j 4.1.0.BUILD-SNAPSHOT
在我的场景中,有一个Node代表一个通用图节点,NodeWithScore继承自Node并包含一些额外的数据。图中的所有节点都只连接到一个NodeWithScore。
我使用了以下映射:
@NodeEntity
@Setter
@Getter
@NoArgsConstructor
public class Node {
@GraphId
private Long id;
private String name;
@Relationship(type = "SCORE")
private NodeWithScore nodeWithScore;
@Relationship(type = "CHILD")
private Set<Node> children;
@Override
public String toString() {
return String.format("%s -> %s", name,
children == null ? "[]" : children.stream().map(Node::getName).collect(toList()));
}
}
和
@NodeEntity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class NodeWithScore extends Node {
protected Double score;
}
调用以下代码时:
Node a = new Node();
a.setName("A");
Node b = new Node();
b.setName("B");
NodeWithScore c = new NodeWithScore();
c.setName("C");
a.setChildren(ImmutableSet.of(b));
b.setChildren(ImmutableSet.of(c));
a.setNodeWithScore(c);
b.setNodeWithScore(c);
c.setNodeWithScore(c);
session.save(a);
一切都按预期工作 - 节点A有一个子B,而子B又有一个子C,并且所有三个都通过与节点C的SCORE关系连接。
显然,如果在下一行我打电话:
ImmutableSet.of(a, b, c).forEach(System.out::println);
结果将是:
A -> [B]
B -> [C]
C -> []
但是,如果在下一行我试着打电话:
session.loadAll(Node.class).forEach(System.out::println);
我得到以下结果:
A -> [B, C]
B -> [C]
C -> [B]
请告诉我这是neo4j的错误,还是我做错了。