Neo4j 什么样的数据问题会导致;AmbiguousBaseClassException:在类型层次结构中找到多个映射到[…]”的类;?

Neo4j 什么样的数据问题会导致;AmbiguousBaseClassException:在类型层次结构中找到多个映射到[…]”的类;?,neo4j,spring-data-neo4j,Neo4j,Spring Data Neo4j,很明显,我的Springboot/Neo4j应用程序在启动时(大约在第一次访问Neo时)就开始出现此异常: AmbiguousBaseClasseException:在类型层次结构中找到多个映射到[Audit,AppInfo]的类。 在尝试了很多失败的事情之后,在绝望中我把数据库转储了 (使用匹配(n)分离删除n) 然后重新启动 突然,它又开始工作了。换句话说,这个错误不是(仅仅)由代码引起的,而是由数据引起的 这就好像所引用的“类型层次结构”是从数据库中读取的东西,而我似乎已经能够“打破它”

很明显,我的Springboot/Neo4j应用程序在启动时(大约在第一次访问Neo时)就开始出现此异常:

AmbiguousBaseClasseException:在类型层次结构中找到多个映射到[Audit,AppInfo]的类。

在尝试了很多失败的事情之后,在绝望中我把数据库转储了

(使用
匹配(n)分离删除n

然后重新启动

突然,它又开始工作了。换句话说,这个错误不是(仅仅)由代码引起的,而是由数据引起的

这就好像所引用的“类型层次结构”是从数据库中读取的东西,而我似乎已经能够“打破它”

现在我担心我会突然出现这个弹出窗口,因为我不能直接转储数据

那么,我如何才能找出这一问题的原因,以及用什么样的方法才能解决这个问题呢

编辑:我最初没有粘贴相关结构的细节,因为我希望这是一个“类”问题,可以描述、防御和诊断,而无需参考我的实例。也许这太天真了

以下是错误消息中命名的两个类:

编辑2:问题今天再次出现,出现了另一对

可能是同一个问题。在该特定问题中,数据库中的所有
Actor
Director
节点也具有
Person
标签。开发人员通过实现
Actor
Director
类来模拟这种双重标签的情况,这些类子类化了
Person
类。因此,当调用
PersonRepository.findActorsOfMovie()
时,OGM库不知道是返回
Person
实例的
集还是
Actor
实例集。
PersonRepository.findDirectorOfMovie()
也存在类似的问题。其他方法可能没有类似的问题,导致出现间歇性故障(但实际上是由于不同用例使用不同的方法)

您的类层次结构可能存在类似的问题(关于特定的DB数据模型)。如果是这样,您的OGM方法签名可能永远不会使用相关的基类。

可能存在相同的问题。在该特定问题中,数据库中的所有
Actor
Director
节点也具有
Person
标签。开发人员通过实现
Actor
Director
类来模拟这种双重标签的情况,这些类子类化了
Person
类。因此,当调用
PersonRepository.findActorsOfMovie()
时,OGM库不知道是返回
Person
实例的
集还是
Actor
实例集。
PersonRepository.findDirectorOfMovie()
也存在类似的问题。其他方法可能没有类似的问题,导致出现间歇性故障(但实际上是由于不同用例使用不同的方法)


您的类层次结构可能存在类似的问题(关于特定的DB数据模型)。如果是这样,您的OGM方法签名可能永远不会使用相关的基类。

谢谢您的帮助。被接受的答案是正确的,但是一些细节和一个不同的“原因”被列出,以防其他人像我一样与之抗争

它是什么:

用Java/spring-data-neo4j术语描述,当来自两个“类”的节点以具有相同名称的“属性”结束时,确实会出现这种情况

它是如何发生的:

如果您有两个类具有相同的
属性
名称,则(显然)会发生这种情况,如接受答案中所述

但如果继续使用(在Java中)已删除的节点,也可能发生这种情况

删除的节点就像一个指向已释放内存的指针——如果在此之后继续使用它,则结果是未定义的。并可能导致删除节点的属性写入删除后保存中的其他节点

如何找到罪犯:

似乎您将从错误消息中获得一对类。您所要做的就是从一个类中查找具有另一个类属性的实例

在Neo web浏览器中,我发现这与单击属性最少的类中的属性一样简单,从而使其运行“显示具有此属性的实例”查询


我不必浏览输出中的每个结果,因为应用程序会在结果的顶部列出具有此属性的节点的数量和类型。因此,您所要做的就是查找一个查询,该查询会产生多种类型的节点,而罪魁祸首就在那里。

谢谢您的帮助。被接受的答案是正确的,但是一些细节和一个不同的“原因”被列出,以防其他人像我一样与之抗争

它是什么:

用Java/spring-data-neo4j术语描述,当来自两个“类”的节点以具有相同名称的“属性”结束时,确实会出现这种情况

它是如何发生的:

如果您有两个类具有相同的
属性
名称,则(显然)会发生这种情况,如接受答案中所述

但如果继续使用(在Java中)已删除的节点,也可能发生这种情况

删除的节点就像一个指向已释放内存的指针——如果在此之后继续使用它,则结果是未定义的。并可能导致将已删除节点的属性写入中的其他节点