也许有人可以给我一个提示。是否可以测量属于同一本体的2个概念/类之间的距离?
例如,假设我有一个本体论 天文学课和望远镜课。两者之间存在联系,但它不是直接链接。天文学有一个名为Science的父类,而Telescope有一个名为Optical Instrument的父类,它属于名为Instrumentation的父类,它与一个名为Empirical Science的类有关,该类最终属于一个名为Science的类。
因此,望远镜和天文学之间存在间接联系,我想找出从另一个班级开始到达一个班级所需的步骤数。
是否有一个简单的SPARQL查询可以解决该问题?或者有更好的方法来完成这项工作?或者不可能使用语义Web范例找到它?
任何提示都将非常受欢迎。
答案 0 :(得分:5)
SPARQL提供了在图表中搜索任意长度路径的功能,但没有机制告诉您该路径的长度。
所以你可以这样做:
SELECT * WHERE { ?s ex:property+ ?o }
语法非常像正则表达式,所以你可以做替代,限制基数等等。
答案 1 :(得分:4)
在我的理解中,SPARQL不包含任何递归构造,以便能够测量任意长度的间接链接。您可以做的最好的事情是准备一组查询distance_1(a, b)
,distance_2(a, b)
...以检查两个概念之间的具体距离。
另一种方法是使用非SPARQL技术发现此信息,例如使用RDFlib在Python中编写图遍历算法。
答案 2 :(得分:2)
既然您明确提到您正在讨论类并且它们将处于相同的本体中,则可以安全地假设它们将始终连接(因为最终它们都将是“Thing”的子类,对吧?)。另一方面,我在括号中提到的路径(Class1 - > ... - > Thing< - ...< - Class2)是一个微不足道的路径,所以我想你想找到...两个类之间的所有现有路径,换句话说,两个顶点之间的所有现有路径。真的吗?或者你在寻找最短的路径?你的问题在这方面不是很清楚,你能澄清一下吗?
据我所知,没有简单的SPARQL构造可以列出类之间的所有路径或最短路径。然而,一些语义网三重存储带有图形遍历算法,如广度优先搜索或深度优先搜索,请参考:
您可能还会发现以下项目的源代码非常有用: