Neo4j-Spring-数据深度功能不适用于丰富的关系
Neo4j-Spring-Data depth feature is not working with a rich relationship
我正在使用 Neo4j "Neo4j-OGM" 中的 API,但在尝试使用 findAll(int depth) 方法时遇到了困难。
我的问题是,当我拥有丰富的人际关系时,深度就会消失。在某些情况下它可以正常工作,例如 findAll(0)、findById(int id, int depth)、findAll(...) 当结果为 1 时,或者当我有一个简单的关系时。我将分享我的数据结构和 json。
Person.class 和 Friend.class
@NodeEntity
@Data
public class Person{
@Id
private String id;
private String name;
@Property("born")
private int birthyear;
@JsonIgnoreProperties({"person1"})
@Relationship(type = "FRIEND_OF")
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<Friend> friendOfs;
@JsonIgnoreProperties({"person"})
@Relationship(type = "FRIEND_OF",direction = Relationship.INCOMING)
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<Friend> friendOfMy ;
}
@Data
@RelationshipEntity(value = "FRIEND_OF")
public class Friend {
@Id
@GeneratedValue
private Long id;
private String since;
@StartNode
@JsonIgnoreProperties({"friendOfs"})
private Person person1;
@EndNode
@JsonIgnoreProperties({"friendOfMy"})
private Person person;
}
当我向 http://localhost:8080/rest/persons/all/2-> ("2"=depth)
发出获取请求时
[{
{
"id": "24",
"name": "Tony",
"birthyear": 0,
"friendOfMy": [
{
"id": 0,
"since": "2008-06-06",
"person1": {
"id": "2",
"name": "Lina",
"birthyear": 0,
"friendOfMy": [
{
"id": 460,
"since": "2008-06-06",
"person1": {
"id": "1",
"name": "Fernando",
"birthyear": 0,
"friendOfMy": [
{
"id": 462,
"since": "2008-06-06",
"person1": {
"id": "4",
"name": "Sui",
"birthyear": 0
}
}
]
}
}
]
}
}
]},
{
"id": "3",
"name": "Wlisses",
"birthyear": 0,
"friendOfMy": [
{
"id": 461,
"since": "2000-06-06",
"person1": {
"id": "1",
"name": "Fernando",
"birthyear": 0,
"friendOfMy": [
{
"id": 462,
"since": "2008-06-06",
"person1": {
"id": "4",
"name": "Sui",
"birthyear": 0
}
}
]
}
}
]
},
.
.
.
{
"id": "1",
"name": "Fernando",
"birthyear": 0,
"friendOfs": [
{
"id": 461,
"since": "2000-06-06",
"person": {
"id": "3",
"name": "Wlisses",
"birthyear": 0
}
},
{
"id": 460,
"since": "2008-06-06",
"person": {
"id": "2",
"name": "Lina",
"birthyear": 0,
"friendOfs": [
{
"id": 0,
"since": "2008-06-06",
"person": {
"id": "24",
"name": "Tony",
"birthyear": 0
}
}
]
}
}
],
"friendOfMy": [...]
}]
如您所见,第一个结果的深度为 3。
我猜,这是因为 Java 的内存引用。
我想知道是否可以解决或者我做错了什么。
不,你在这里没有做错任何事情,你的假设是非常正确的。
Neo4j-OGM 缓存在事务/会话期间加载的所有实体。
在 findAll
的情况下,它收集所有已加载的实体并将它们分配给它们的关系。这意味着如果它在第二层找到 Sui - 正如你定义的深度 - Wlisses' 朋友,它将把它附加到 Fernando在Tony的结果中是否是匹配关系。
目前 Neo4j-OGM 中没有机制可以避免这种情况。
我正在使用 Neo4j "Neo4j-OGM" 中的 API,但在尝试使用 findAll(int depth) 方法时遇到了困难。 我的问题是,当我拥有丰富的人际关系时,深度就会消失。在某些情况下它可以正常工作,例如 findAll(0)、findById(int id, int depth)、findAll(...) 当结果为 1 时,或者当我有一个简单的关系时。我将分享我的数据结构和 json。
Person.class 和 Friend.class
@NodeEntity
@Data
public class Person{
@Id
private String id;
private String name;
@Property("born")
private int birthyear;
@JsonIgnoreProperties({"person1"})
@Relationship(type = "FRIEND_OF")
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<Friend> friendOfs;
@JsonIgnoreProperties({"person"})
@Relationship(type = "FRIEND_OF",direction = Relationship.INCOMING)
@JsonInclude(JsonInclude.Include.NON_NULL)
private List<Friend> friendOfMy ;
}
@Data
@RelationshipEntity(value = "FRIEND_OF")
public class Friend {
@Id
@GeneratedValue
private Long id;
private String since;
@StartNode
@JsonIgnoreProperties({"friendOfs"})
private Person person1;
@EndNode
@JsonIgnoreProperties({"friendOfMy"})
private Person person;
}
当我向 http://localhost:8080/rest/persons/all/2-> ("2"=depth)
发出获取请求时[{
{
"id": "24",
"name": "Tony",
"birthyear": 0,
"friendOfMy": [
{
"id": 0,
"since": "2008-06-06",
"person1": {
"id": "2",
"name": "Lina",
"birthyear": 0,
"friendOfMy": [
{
"id": 460,
"since": "2008-06-06",
"person1": {
"id": "1",
"name": "Fernando",
"birthyear": 0,
"friendOfMy": [
{
"id": 462,
"since": "2008-06-06",
"person1": {
"id": "4",
"name": "Sui",
"birthyear": 0
}
}
]
}
}
]
}
}
]},
{
"id": "3",
"name": "Wlisses",
"birthyear": 0,
"friendOfMy": [
{
"id": 461,
"since": "2000-06-06",
"person1": {
"id": "1",
"name": "Fernando",
"birthyear": 0,
"friendOfMy": [
{
"id": 462,
"since": "2008-06-06",
"person1": {
"id": "4",
"name": "Sui",
"birthyear": 0
}
}
]
}
}
]
},
.
.
.
{
"id": "1",
"name": "Fernando",
"birthyear": 0,
"friendOfs": [
{
"id": 461,
"since": "2000-06-06",
"person": {
"id": "3",
"name": "Wlisses",
"birthyear": 0
}
},
{
"id": 460,
"since": "2008-06-06",
"person": {
"id": "2",
"name": "Lina",
"birthyear": 0,
"friendOfs": [
{
"id": 0,
"since": "2008-06-06",
"person": {
"id": "24",
"name": "Tony",
"birthyear": 0
}
}
]
}
}
],
"friendOfMy": [...]
}]
如您所见,第一个结果的深度为 3。 我猜,这是因为 Java 的内存引用。
我想知道是否可以解决或者我做错了什么。
不,你在这里没有做错任何事情,你的假设是非常正确的。
Neo4j-OGM 缓存在事务/会话期间加载的所有实体。
在 findAll
的情况下,它收集所有已加载的实体并将它们分配给它们的关系。这意味着如果它在第二层找到 Sui - 正如你定义的深度 - Wlisses' 朋友,它将把它附加到 Fernando在Tony的结果中是否是匹配关系。
目前 Neo4j-OGM 中没有机制可以避免这种情况。