[英]get the intersected classes in SPARQL query using RDFLib
我有一个类ABC
是一个subClassOf
类XYZ
和定义为类交点A
, B
, C
为:
<Class rdf:about="&clink;ABC">
<equivalentClass>
<Class>
<intersectionOf rdf:parseType="Collection">
<Restriction>
<onProperty rdf:resource="&clink;affects"/>
<someValuesFrom rdf:resource="&clink;A"/>
</Restriction>
<Restriction>
<onProperty rdf:resource="&clink;hasMarker"/>
<someValuesFrom rdf:resource="&clink;B"/>
</Restriction>
<Restriction>
<onProperty rdf:resource="&clink;hasPathologicalProcess"/>
<someValuesFrom rdf:resource="&clink;C"/>
</Restriction>
</intersectionOf>
</Class>
</equivalentClass>
<rdfs:subClassOf rdf:resource="&clink;XYZ"/>
</Class>
如何使用RDFLib中的SPARQL查询通过XYZ
类访问A
, B
和C
类?
以下查询返回一个空白节点rdflib.term.BNode('_L')
,我不知道如何处理BNodes。
PREFIX rdf: h<ttp://www.w3.org/2000/01/rdf-schema#>
SELECT ?subclass
WHERE {<XYZ> <rdf:subClassOf> <subclass>}
我需要一个接收XYZ
并返回以下内容的查询:
A
B
C
首先, XYZ
既不是subClassOf
A
, B
, C
也不是subClassOf
它们的交点A and B and C
(我用的曼彻斯特syntaax(见这里) )。
在你的代码片段,您可以定义XYZ
是equivalentTo
(这意味着是一个subClassOf
的三个路口的为好) anynomous(见这里)类; 这是(affects some A) and (hasMaker some B) and (hasPathologicalProcess some C)
。 此交集不等同于A and B and C
(在曼彻斯特语法中, some
代表someValuesFrom
)。
要了解someValuesFrom
限制的含义,请参阅 OWL的文档(请参阅此处) :
值约束
owl:someValuesFrom
是一个内置的OWL属性,它将限制类链接到类描述或数据范围。 包含owl:someValuesFrom
约束的限制描述了一个所有个体的类,对于这些个体,至少相关属性的一个值是类描述的实例或数据范围内的数据值。 换句话说,它定义了一个至少有一个y
的个体x的类(类描述的实例或数据范围的值),使得对(x,y)
是P
的实例。 这并不排除P
其他实例(x,y')
的y'
不属于类描述或数据范围。
EDIT2:
现在,您应该已经了解owl:someValuesFrom
含义,并且正如@AKSW所建议的那样,这是一个简单的SPARQL查询。 但是,您不能仅使用rdfs:subClassOf
来检索A
, B
和C
! 您应该首先检索该限制,然后访问该属性及其定义的类,如下所示:
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
select ?eqclass ?restriction ?onProp ?someValuesFrom where {
{?eqclass owl:equivalentClass/owl:intersectionOf _:b. _:b rdf:first ?restriction}
# First anonymous class (restriction) in the collection
UNION { ?eqclass owl:equivalentClass/owl:intersectionOf/(rdf:rest+/rdf:first+)* ?restriction.}
# getting other anonymous classes (restriction) using property paths and rdf:first and rdf:rest used in RDF collections.
?restriction rdf:type owl:Restriction.
# individuals of type owl:Restriction
?restriction owl:onProperty ?onProp.
# the property the restriciton is defined on which
?restriction owl:someValuesFrom ?someValuesFrom.
# the class of the owl:someValuesFrom property
}
EDIT2结束
通过修改数据模型的其他方法。
因此,首先,您的查询应返回匿名类(affects some A) and (hasMaker some B) and (hasPathologicalProcess some C)
,这是您定义的交集。 但是,由于它是一个匿名类, B_node
将为它返回一个空白节点B_node
,而不是一个具体的类。 要返回一个具体的类,您应该将此匿名交集定义为该交集的本体中的一个类。 例如,您可以创建类anyn_intersection
,如下所示:
<owl:Class rdf:about="myPrefix#anyn_intersection">
<owl:equivalentClass>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#affects"/>
<owl:someValuesFrom rdf:resource="myPrefix#A"/>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#hasMaker"/>
<owl:someValuesFrom rdf:resource="myPrefix#B"/>
</owl:Restriction>
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#hasPathologicalProcess"/>
<owl:someValuesFrom rdf:resource="myPrefix#C"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</owl:equivalentClass>
</owl:Class>
因此,您的查询将获得此类anyn_intersection
而不是空白节点。
现在,如果要在结果中获取所有(affects some A)
, (hasMaker some B)
和(hasPathologicalProcess some C)
,则应首先 确保推理程序正在运行,因为这是一个隐式知识, 其次您应该对于每个匿名交集类,以与上述anyn_intersection
类似的方式定义一个具体的交集类 。 例如,您可以为匿名限制类定义anyn_AffectsSomeA
: affects some A
如下:
<owl:Class rdf:about="myPrefix#anyn_AffectsSomeA">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="myPrefix#affects"/>
<owl:someValuesFrom rdf:resource="myPrefix#A"/>
</owl:Restriction>
</owl:equivalentClass>
</owl:Class>
然后,您必须定义两个类似的类anyn_hasMakerSomeB
和anyn_hasPathologicalProcessSomeC
。 最后,将anyn_intersection
定义为anyn_AffectsSomeA
, anyn_hasMakerSomeB
和anyn_hasPathologicalProcessSomeC
。
EDIT1:
我不知道rdfLib
中是否有某些特定功能rdfLib
来检索匿名类定义。 这可能可以解决您的问题,而不必按照我建议的方式进行定义。 此外,您应确保推理机正在运行。
EDIT1的结尾:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.