我正在使用 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>
我面临的问题是:
所以我的问题是:如何配置 Spring Data Neo4j 来处理双向关系而不创建循环依赖或复制主标签?
任何帮助或建议将不胜感激。
提前谢谢您。
这有两种表达方式:
我最终遇到了循环依赖,导致应用程序无法加载
正如您已经经历过的,在数据库中定义双向依赖关系可能会导致意外的性能下降,因为使用高连通图,SDN 将获取可到达的“所有内容”。
对于您的情况,有一个投影功能,它允许您定义仅反映已定义全局模型的子集的接口。
这是因为 Jackson 会追逐每一个可达的领域,而
SoftwareComponent
->SoftwareComponent
->Software...
是一个无限的自引用循环。为了打破这个问题,我给出的关于 Jackson 使用的提到的答案(感谢@cybersam 已经找到了这个链接)仍然有效。