2

假设您正在通过 SPARQL 端点查询数据源,并且您想知道该数据源的底层表示是 OWL 还是 RDF/XML。无论如何,您可以通过 SPARQL 查询来做到这一点吗?我个人的想法是编写一个使用 OWL 属性之一的查询并查看它是否返回任何结果,但是使用这种方法的缺点是,如果您使用的 OWL 属性甚至不会出现在数据源中如果基础表示是 OWL,您将不会得到响应。这里的假设是您无权访问架构。

4

1 回答 1

1

我认为一个有趣的方法是编写一个查询来获取所有三元组,这些三元组涉及您所关心的模式语言的一些保留 URI,这有望为您提供模式或本体。例如, OWL 规范中的第2.4 节 IRI给出了为 OWL 保留的 IRI 列表。像这样的查询有望为您提供所需的大部分信息:

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix owl: <http://www.w3.org/2002/07/owl#>

construct { ?s ?p ?o }
where { 
  values ?res { 
    owl:backwardCompatibleWith owl:bottomDataProperty owl:bottomObjectProperty owl:deprecated owl:incompatibleWith
    owl:Nothing owl:priorVersion owl:rational owl:real owl:versionInfo
    owl:Thing owl:topDataProperty owl:topObjectProperty rdf:langRange rdf:PlainLiteral
    rdf:XMLLiteral rdfs:comment rdfs:isDefinedBy rdfs:label rdfs:Literal
    rdfs:seeAlso xsd:anyURI xsd:base64Binary xsd:boolean xsd:byte
    xsd:dateTime xsd:dateTimeStamp xsd:decimal xsd:double xsd:float
    xsd:hexBinary xsd:int xsd:integer xsd:language xsd:length
    xsd:long xsd:maxExclusive xsd:maxInclusive xsd:maxLength xsd:minExclusive
    xsd:minInclusive xsd:minLength xsd:Name xsd:NCName xsd:negativeInteger
    xsd:NMTOKEN xsd:nonNegativeInteger xsd:nonPositiveInteger xsd:normalizedString xsd:pattern
    xsd:positiveInteger xsd:short xsd:string xsd:token xsd:unsignedByte
    xsd:unsignedInt xsd:unsignedLong xsd:unsignedShort
  }

  { ?res ?p ?o . bind( ?res as ?s ) } union
  { ?s ?res ?o . bind( ?res as ?p ) } union
  { ?s ?p ?res . bind( ?res as ?o ) }
}

类似地,您可以使用以下类似的方法来提取 RDFS 模式。此处的保留属性列表基于§6。来自 RDFS 建议的RDF 模式摘要(信息性) 。不过,我删除rdf:type了,因为总会有很多。

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
prefix owl: <http://www.w3.org/2002/07/owl#>

construct { ?s ?p ?o }
where { 
  values ?res {
    rdfs:Resource rdfs:Literal rdf:XMLLiteral rdfs:Class rdf:Property
    rdfs:Datatype rdf:Statement rdf:Bag rdf:Seq rdf:Alt rdfs:Container
    rdfs:ContainerMembershipProperty rdf:List rdfs:subClassOf
    rdfs:subPropertyOf rdfs:domain rdfs:range rdfs:label rdfs:comment
    rdfs:member rdf:first rdf:rest rdfs:seeAlso rdfs:isDefinedBy
    rdf:value rdf:subject rdf:predicate rdf:object
  }

  { ?res ?p ?o . bind( ?res as ?s ) } union
  { ?s ?res ?o . bind( ?res as ?p ) } union
  { ?s ?p ?res . bind( ?res as ?o ) }
}

如果您针对数据集运行这两个查询,您可能会对数据的结构做出有根据的猜测。请注意,OWL 也使用了许多 RDFS 属性,因此粗略的启发式可能是:

  • 如果 OWL 查询返回的信息明显多于 RDFS 查询,则数据可能使用 OWL 本体;否则,它可能使用 RDFS 模式(或根本没有模式)。
于 2013-11-08T15:49:58.753 回答