10

我目前使用 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,但我什么也得不到。

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

4

2 回答 2

10

尽管这是一个库请求问题,因此与 StackOverflow 无关,但我想指出,在许多情况下,您可以使用看起来更复杂的 SPARQL 查询来回答这两个查询。对于这两种情况,您都可以使用以下查询来获取所需的结果,即 where <class-of-interest>is:SuperClass:SiblingClass

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

这会发现?xs 有一条从 开始,rdf:type然后是零个或多个rdfs:subClassOforowl: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   |
--------------
于 2013-12-09T18:13:03.870 回答
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 推理是一个复杂的主题,很大程度上取决于应用程序。

于 2013-12-09T18:04:21.677 回答