我目前正在使用rdflib在Python中创建和管理RDF图。但是,RDFlib不会进行任何RDFS或OWL推理。这导致如下结果:
如果我有
A rdf:type MyType .
MyType rdfs:subClassOf SuperType .
我问
select ?x where {?x rdf:type SuperType}
然后我什么都没得到,但我想得到A
(通过RDFS语义)。
同样的事情发生在owl:equivalentClass
上。如果我有
A rdf:type MyType .
MyType owl:equivalentClass SiblingType .
我问
select ?x where {?x rdf:type SiblingType}
我想获得A
,但我什么都没得到。
有没有办法获得这些结果?
答案 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:subClassOf
或owl: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)
修改:此回答是针对原始的不同问题发布的。
不,你不应该。 RDF 本身不包含任何关于本体的内容,它只是一个愚蠢的图,这就是RDFLib所做的。我应该得到A,但我一无所获!
超越这个被称为推理的数据。这是一个额外的层。 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推理是一个复杂的主题,在很大程度上取决于应用程序。