Ale*_*lex 9 python rdf owl sparql rdflib
我目前正在使用rdflib在Python中创建和管理RDF图.但是,RDFlib不会进行任何RDFS或OWL推理.这导致如下结果:
如果我有
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语义).
同样的事情发生在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,但我一无所获.
有没有办法获得这些结果?
虽然这是一个库请求问题,因此,对于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:subClassOf或owl: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)
编辑:这个答案是针对原始的,不同的问题发布的.
我应该得到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推理是一个复杂的主题,在很大程度上取决于应用程序.
| 归档时间: |
|
| 查看次数: |
1771 次 |
| 最近记录: |