繁体   English   中英

使用RDFLib获取SPARQL查询中的相交类

[英]get the intersected classes in SPARQL query using RDFLib

我有一个类ABC是一个subClassOfXYZ和定义为类交点ABC为:

<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类访问ABC类?

以下查询返回一个空白节点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 ABC也不是subClassOf它们的交点A and B and C (我用的曼彻斯特syntaax(见这里) )。

在你的代码片段,您可以定义XYZequivalentTo (这意味着是一个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来检索ABC 您应该首先检索该限制,然后访问该属性及其定义的类,如下所示:

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_AffectsSomeAaffects 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_hasMakerSomeBanyn_hasPathologicalProcessSomeC 最后,将anyn_intersection定义为anyn_AffectsSomeAanyn_hasMakerSomeBanyn_hasPathologicalProcessSomeC

EDIT1:

我不知道rdfLib中是否有某些特定功能rdfLib来检索匿名类定义。 这可能可以解决您的问题,而不必按照我建议的方式进行定义。 此外,您应确保推理机正在运行。

EDIT1的结尾:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM