Spring Data Neo4j 的问题:在没有循环依赖的情况下双向获取关系

问题描述 投票:0回答:1

我正在使用 Spring 3.3.2 和 Spring Data Neo4j 7.3.2。我有一个看起来像这样的存储库:

@Query("MATCH p=allShortestPaths((rootNode:SoftwareComponent {softwareComponent:${"$"}softwareComponent , version:${"$"}version })-[:DEPENDS_ON_SOFTWARE_COMPONENT *1..15]->(dependentNode:SoftwareComponent)) " +
        "WHERE rootNode <> dependentNode " +
        "WITH rootNode AS __sn__, collect(distinct (relationships(p))) AS __sr__, collect(distinct (dependentNode)) AS __srn__ " +
        "RETURN __sn__, __sr__, __srn__")
fun findDependencyByVersion(
        @Param("softwareComponent") softwareComponent: String, @Param("version") version: String
): List<SoftwareComponent>

我正在使用以下节点定义:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator::class, property = "id")
@Node("SoftwareComponent")
class SoftwareComponent(
    @Property(name = "softwareComponent") var softwareComponent: String,
    @Property(name = "version") var version: String,
    @Relationship(type = "DEPENDS_ON_SOFTWARE_COMPONENT", direction = Relationship.Direction.OUTGOING)
    @JsonManagedReference
    var dependencies: HashSet<DependsOnSoftwareComponent> = HashSet(),
    @Id @GeneratedValue var id: Long? = null
)

我现在尝试创建另一个存储库来获取我的 SoftwareComponent 的反向依赖项(“消费者”),即依赖于我当前节点的节点。这是我尝试使用的查询:

@Query("MATCH p=(rootNode:SoftwareComponent {softwareComponent: ${"$"}softwareComponent, version: ${"$"}version})<-[r:DEPENDS_ON_SOFTWARE_COMPONENT *0..6]-(s:SoftwareComponent) " +
        "WITH rootNode AS __sn__, collect (relationships(p)) AS __sr__ , collect (nodes(p)) AS __srn__ " +
        "RETURN __sn__, __sr__, __srn__")
fun findConsumerByVersion(
    @Param("softwareComponent") softwareComponent: String, @Param("version") version: String
): List<SoftwareComponent>

我面临的问题是:

  1. 如果我向 SoftwareComponent 类添加具有 INCOMING 关系的消费者字段,最终会出现循环依赖关系,导致应用程序无法加载。
  2. 我尝试创建第二个类来将 SoftwareComponent 表示为“消费者”(例如,ReverseSoftwareComponent)并使用 INCOMING 关系覆盖文件字段依赖关系,但我收到一条错误,表明主标签已重复。

所以我的问题是:如何配置 Spring Data Neo4j 来处理双向关系而不创建循环依赖或复制主标签?

任何帮助或建议将不胜感激。

提前谢谢您。

kotlin spring-data-neo4j
1个回答
0
投票

这有两种表达方式:

我最终遇到了循环依赖,导致应用程序无法加载

应用程序无法加载,因为此存储库的其他操作很慢

正如您已经经历过的,在数据库中定义双向依赖关系可能会导致意外的性能下降,因为使用高连通图,SDN 将获取可到达的“所有内容”。

对于您的情况,有一个投影功能,它允许您定义仅反映已定义全局模型的子集的接口。

渲染结果时,您最终会陷入堆栈溢出

这是因为 Jackson 会追逐每一个可达的领域,而

SoftwareComponent
->
SoftwareComponent
->
Software...
是一个无限的自引用循环。为了打破这个问题,我给出的关于 Jackson 使用的提到的答案(感谢@cybersam 已经找到了这个链接)仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.