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

时间:2013-12-09 15:56:15

标签: python rdf sparql owl rdflib

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

  1. 如果我有

    A rdf:type MyType .
    MyType rdfs:subClassOf SuperType .
    

    我问

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

    然后我什么都没得到,但我想得到A(通过RDFS语义)。

  2. 同样的事情发生在owl:equivalentClass上。如果我有

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

    我问

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

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

  3. 有没有办法获得这些结果?

2 个答案:

答案 0 :(得分:8)

虽然这是一个库请求问题,因此,对于StackOverflow的主题,我想指出,在许多情况下,您可以使用更复杂的SPARQL查询来回答这两个查询。对于这两种情况,您可以使用以下查询来获得所需的结果,其中<class-of-interest>:SuperClass:SiblingClass

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

这会找到?x的路径,这些路径以rdf:type开头,后跟零{或} rdfs:subClassOfowl:equivalentClass,最终到达:SuperType

例如,请考虑Turtle / N3中的以下数据。 (顺便说一句,如果您提出有关针对数据运行查询的问题,请提供我们可以使用的数据。您在问题中提供了类似RDF数据的内容,但我们无法复制,粘贴和编写任何内容。查询。)

@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix : <http://stackoverflow.com/q/20474862/1281433/>

: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):

prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix : <http://stackoverflow.com/q/20474862/1281433/>

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   |
--------------

答案 1 :(得分:5)

修改:此回答是针对原始的不同问题发布的。

  

我应该得到A,但我一无所获!

不,你不应该。 RDF 本身不包含任何关于本体的内容,它只是一个愚蠢的图,这就是RDFLib所做的。

超越这个被称为推理的数据。这是一个额外的层。 Bare RDFLib不做推理,因为它很复杂,而且通常计算成本很高。有第三方推理解决方案,但在您使用它们之前,您应该了解它们的作用以及它们将产生的性能影响。

在RDFLib图上对RDFS和OWL 2推理的一种天真的方法是Ivan Herman’s OWL 2 RL implementation。它非常容易使用,但除非你正在做一个玩具应用程序,否则你几乎肯定不会想要它,因为它是一个愚蠢的算法,在一个真实大小的图形上需要很长时间。

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

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

您还应该考虑您的应用程序实际需要什么样的推断。您是否需要来推断子类成员身份?如果你这样做,也许你需要所有? - 那么也许你可以通过用RDFLib迭代X rdfs:subClassOf Y三元组并插入新的A rdf:type Y三元组来手动完成。

无论如何,请记住语义Web推理是一个复杂的主题,在很大程度上取决于应用程序。