Neo4j 什么样的数据问题会导致;AmbiguousBaseClassException:在类型层次结构中找到多个映射到[…]”的类;?
很明显,我的Springboot/Neo4j应用程序在启动时(大约在第一次访问Neo时)就开始出现此异常:Neo4j 什么样的数据问题会导致;AmbiguousBaseClassException:在类型层次结构中找到多个映射到[…]”的类;?,neo4j,spring-data-neo4j,Neo4j,Spring Data Neo4j,很明显,我的Springboot/Neo4j应用程序在启动时(大约在第一次访问Neo时)就开始出现此异常: AmbiguousBaseClasseException:在类型层次结构中找到多个映射到[Audit,AppInfo]的类。 在尝试了很多失败的事情之后,在绝望中我把数据库转储了 (使用匹配(n)分离删除n) 然后重新启动 突然,它又开始工作了。换句话说,这个错误不是(仅仅)由代码引起的,而是由数据引起的 这就好像所引用的“类型层次结构”是从数据库中读取的东西,而我似乎已经能够“打破它”
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中)已删除的节点,也可能发生这种情况
删除的节点就像一个指向已释放内存的指针——如果在此之后继续使用它,则结果是未定义的。并可能导致将已删除节点的属性写入中的其他节点