使用SPARQL进行有限的RDFS和OWL推理

10

我目前在使用rdflib来在Python中创建和管理RDF图形。然而,RDFlib不会进行任何RDFS或OWL推理。这会导致以下结果:

  1. 如果我有

    A rdf:type MyType .
    MyType rdfs:subClassOf SuperType .
    
    我问
    select ?x where {?x rdf:type SuperType}
    

    那么我什么也得不到,但我希望按照RDFS语义获得 A

  2. 对于owl:equivalentClass也是一样的。如果我有

    A rdf:type MyType .
    MyType owl:equivalentClass SiblingType .
    

    我请求

    select ?x where {?x rdf:type SiblingType}
    

    我想获得A,但什么也没有得到。

    是否有办法获得这些结果?


2
对于rdflib,answers.semanticweb.com上的这个帖子可能会有所帮助。 - DNA
请注意:"在Stack Overflow上询问我们推荐或查找工具、库或喜爱的外部资源的问题属于禁止话题,因为它们往往会吸引有偏见的答案和垃圾邮件。相反,请描述问题以及已经采取的解决方案。" - Joshua Taylor
到目前为止提供的答案是正确的。您正在使用的RDF库很好;问题在于您正在寻找能够进行RDFS或OWL推理的东西。 - Joshua Taylor
冒昧地说,我已经编辑了这个问题,使其符合主题,将其改为“如何使用SPARQL获得预期的结果?” 这个问题是符合主题的,而原来的问题(询问Python库)则不是。 - Joshua Taylor
2个回答

10

虽然这是一个图书馆请求问题,因此不适合在StackOverflow上讨论,但我想指出,在许多情况下,你可以使用稍微复杂的SPARQL查询来回答这两个查询。对于这两种情况,你可以使用以下查询来获取所需的结果,其中<class-of-interest>:SuperClass:SiblingClass:

select ?x where {
  ?x rdf:type/(rdfs:subClassOf|owl:equivalentClass)* <class-of-interest> .
}

这个查询找到所有具有从 rdf:type 开始,后跟零个或多个 rdfs:subClassOfowl:equivalentClass 并最终到达 :SuperType 的路径的 ?x

例如,考虑以下Turtle / N3格式的数据。 (顺便说一句,如果您有关于运行对数据的查询的问题,请提供可用于处理的数据。您在问题中提供了类似RDF数据的东西,但没有任何可以复制和粘贴以编写查询的内容。)

@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <https://dev59.com/eGIj5IYBdhLWcg3wPy4a/>

:i1 a :C .
:C rdfs:subClassOf :D .
:D rdfs:subClassOf :E .

:i2 a :F .
:F rdfs:subClassOf :G1 .
:G1 owl:equivalentClass :G2 .
:G2 rdfs:subClassOf :H .

您可以像上面那样运行查询来选择个体和它们的类型(请注意,a是SPARQL和Turtle/N3中rdf:type的速记):

您可以像上面那样运行查询,选择个体及其类型(请注意,a在SPARQL和Turtle/N3中用作rdf:type的缩写):

prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <https://dev59.com/eGIj5IYBdhLWcg3wPy4a/>

select ?i ?type where {
  ?i a/(rdfs:subClassOf|owl:equivalentClass)* ?type
}
--------------
| i   | type |
==============
| :i2 | :F   |
| :i2 | :G1  |
| :i2 | :G2  |
| :i2 | :H   |
| :i1 | :C   |
| :i1 | :D   |
| :i1 | :E   |
--------------

谢谢@Joshua,你是用redlib得到这个结果的吗? - Alex
@Alex 其实,我一直在使用Jenna的命令行工具。不过这是标准的SPARQL 1.1,所以它应该在任何地方都能运行。 - Joshua Taylor
@JoshuaTaylor 谢谢你,这个查询非常有帮助。请问您知道我可以在哪里找到您写的语法吗?其中包含 /*,这样我就可以了解 SPARQL 1.1 其他可能的查询/功能了。 - Ania David
@ania,就像我之前说过很多次的那样,所有的信息都在文档中。如果你在SPARQL 1.1规范中搜索“属性路径”,它会直接出现。(当然,你需要提前知道“属性路径”这个术语,才能知道要搜索什么,但我想我之前已经提到过了...) - Joshua Taylor
1
@ania 特别注意,查看9 属性路径部分。 - Joshua Taylor
显示剩余3条评论

9

编辑:此回答是针对原问题发布的。

我应该得到A,但我什么也没收到!

不,你不应该。RDF 本身 不包含任何关于本体的信息,它只是一个简单的图形,这就是RDFLib所做的事情。

超越这一点被称为对数据进行推理。这是一个额外的层次。裸的RDFLib不做推理,因为它很复杂,并且通常非常计算密集。有第三方解决方案可用于推理,但在使用它们之前,您应该了解它们的作用和性能影响。

在RDFLib图形上进行RDFS和OWL 2推理的天真方法是Ivan Herman的OWL 2 RL实现。它非常易于使用,但除非您正在进行玩具应用程序,否则几乎肯定不需要它,因为它是一个愚笨的算法,在现实大小的图形上需要很长时间。

FuXi是一个更强大的库,实现了更智能的Rete-UL算法。但我不确定它是否得到维护或者在当前版本的RDFLib下是否可用。

还有大量非基于Python的推理解决方案,例如Pellet,但将它们与RDFLib或任何其他RDF库集成可能是一项繁琐的任务。

您还应考虑您的应用程序实际需要什么样的推断。您是否需要推断子类成员资格?如果是这样,那也许这就是您所需要的全部? —— 然后也许您可以通过使用RDFLib迭代X rdfs:subClassOf Y三元组并插入新的A rdf:type Y三元组来手动完成。

无论如何,记住语义Web推理是一个复杂的主题,且与应用程序密切相关。


谢谢@Vasiliy。目前我正在手动推断这些实例。我认为自动获取它们是更好的解决方案,但我不知道它是如此困难。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接