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

Ale*_*lex 9 python rdf owl sparql rdflib

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

  1. 如果我有

    A rdf:type MyType .
    MyType rdfs:subClassOf SuperType .
    
    Run Code Online (Sandbox Code Playgroud)

    我问

    select ?x where {?x rdf:type SuperType}
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    A rdf:type MyType .
    MyType owl:equivalentClass SiblingType .
    
    Run Code Online (Sandbox Code Playgroud)

    我问

    select ?x where {?x rdf:type SiblingType}
    
    Run Code Online (Sandbox Code Playgroud)

    我想得到A,但我一无所获.

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

Jos*_*lor 8

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

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

这会找到?x具有rdf:type以零开头或后跟零或更多rdfs:subClassOfowl:equivalentClass最终到达的路径的s :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 .
Run Code Online (Sandbox Code Playgroud)

您可以运行如上所述的查询来选择个人及其类型(请注意,这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
}
Run Code Online (Sandbox Code Playgroud)
--------------
| i   | type |
==============
| :i2 | :F   |
| :i2 | :G1  |
| :i2 | :G2  |
| :i2 | :H   |
| :i1 | :C   |
| :i1 | :D   |
| :i1 | :E   |
--------------
Run Code Online (Sandbox Code Playgroud)


Vas*_*nov 5

编辑:这个答案是针对原始的,不同的问题发布的.

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

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

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

对RDFS和OWL 2推理RDFAib图的一种天真的方法是Ivan Herman的OWL 2 RL实现.它非常容易使用,但除非你正在进行玩具应用,否则你几乎肯定不需要它,因为它是一个愚蠢的算法,需要很长时间才能生成一个真实大小的图形.

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

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

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

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