深度为 1 的关系实体也获取节点的关系
Relationship entities with depth 1 also fetching Node's relationships
我在我的项目中使用 neo4j-ogm 3.1.5。
在我的代码中,当我使用 depth = 1
获取任何关系实体时,它会获取 startNode 和 endNode,并且还会获取 startNode 和 endNode 的关系。基本上,它的深度参数作为 depth = depth + 1
工作,因为在获取关系实体时将相同的深度值传递给节点。
AFAIK 理解深度参数基本上像休眠的 LAZY 或 EAGER 加载一样使用。
在 SchemaRelationshipLoadClauseBuilder
class 中,它发生在方法
中
public String build(String variable, String label, int depth)
重现步骤
使用 findById
方法获取关系实体
当前实施
在SchemaRelationshipLoadClauseBuilder
中,方法如下:
public String build(String variable, String label, int depth)
- 调用
expand(sb, "n", start, depth)
而不是 expand(sb, "n", start, depth-1)
,并且
- 调用
expand(sb, "m", end, depth)
而不是 expand(sb, "m", end, depth-1)
。
问题是,这会导致我的项目出现问题,因为各个关系实体的 startNode 和 endNode 可以有超过 100 000 个同类关系,并且获取所有这些关系将占用内存机器。
谁能解释一下为什么会这样?
此行为的原因不是错误,而是 Cypher 查询的性质。
您不能单独加载关系。
必须有开始和结束节点才能形成正确的查询。
然后深度将应用于两个节点。
当然,这或多或少是一种定义,如果你已经从关系到节点中获取了一个 "hop" 但这肯定也会质疑 Neo4j-OGM 中的一般深度模型,因为突然间每个关系(不接触节点) 将算作一跳,击中该节点将是下一跳。
我在我的项目中使用 neo4j-ogm 3.1.5。
在我的代码中,当我使用 depth = 1
获取任何关系实体时,它会获取 startNode 和 endNode,并且还会获取 startNode 和 endNode 的关系。基本上,它的深度参数作为 depth = depth + 1
工作,因为在获取关系实体时将相同的深度值传递给节点。
AFAIK 理解深度参数基本上像休眠的 LAZY 或 EAGER 加载一样使用。
在 SchemaRelationshipLoadClauseBuilder
class 中,它发生在方法
public String build(String variable, String label, int depth)
重现步骤
使用 findById
方法获取关系实体
当前实施
在SchemaRelationshipLoadClauseBuilder
中,方法如下:
public String build(String variable, String label, int depth)
- 调用
expand(sb, "n", start, depth)
而不是expand(sb, "n", start, depth-1)
,并且 - 调用
expand(sb, "m", end, depth)
而不是expand(sb, "m", end, depth-1)
。
问题是,这会导致我的项目出现问题,因为各个关系实体的 startNode 和 endNode 可以有超过 100 000 个同类关系,并且获取所有这些关系将占用内存机器。
谁能解释一下为什么会这样?
此行为的原因不是错误,而是 Cypher 查询的性质。 您不能单独加载关系。 必须有开始和结束节点才能形成正确的查询。
然后深度将应用于两个节点。 当然,这或多或少是一种定义,如果你已经从关系到节点中获取了一个 "hop" 但这肯定也会质疑 Neo4j-OGM 中的一般深度模型,因为突然间每个关系(不接触节点) 将算作一跳,击中该节点将是下一跳。