检查底层表示是OWL还是RDFS

检查底层表示是OWL还是RDFS,rdf,sparql,semantic-web,owl,rdfs,Rdf,Sparql,Semantic Web,Owl,Rdfs,假设您正在通过SPARQL端点查询数据源,并且希望知道此数据源的底层表示形式是OWL还是RDF/XML。您是否可以通过SPARQL查询来实现这一点? 我个人的想法是编写一个使用OWL属性之一的查询,看看是否返回任何结果,但是使用这种方法的缺点是,如果使用的OWL属性不出现在数据源中,即使底层表示是OWL,也不会得到响应。这里的假设是您没有访问模式的权限 我认为一个有趣的方法是编写一个查询,获取所有三元组,这些三元组涉及到您所关心的模式语言的一些保留URI,这有望为您提供模式或本体。例如,OWL规

假设您正在通过SPARQL端点查询数据源,并且希望知道此数据源的底层表示形式是OWL还是RDF/XML。您是否可以通过SPARQL查询来实现这一点?
我个人的想法是编写一个使用OWL属性之一的查询,看看是否返回任何结果,但是使用这种方法的缺点是,如果使用的OWL属性不出现在数据源中,即使底层表示是OWL,也不会得到响应。这里的假设是您没有访问模式的权限

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

前缀rdf:
前缀rdfs:
前缀xsd:
前缀owl:
构造{s?p?o}
何处{
值?res{
owl:backwardCompatibleWith owl:bottomDataProperty owl:bottomObjectProperty owl:Disprecated owl:CompatibleWith
owl:Nothing owl:priorVersion owl:rational owl:real owl:versionInfo
owl:Thing owl:topDataProperty owl:TopObject属性rdf:langRange rdf:PlainLiteral
rdf:XMLLiteral rdfs:comment rdfs:isDefinedBy rdfs:label rdfs:Literal
rdfs:另请参见xsd:anyURI xsd:base64二进制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)}并
{s?res?o.bind(?res as?p)}并
{s?p?res.bind(?res as?o)}
}
类似地,您可以使用下面这样的方法来提取RDFS模式。这里的保留属性列表基于RDFS建议。不过,我删除了rdf:type,因为它总是很多

前缀rdf:
前缀rdfs:
前缀xsd:
前缀owl:
构造{s?p?o}
何处{
价值观{
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:Subassof
rdfs:subpertyof-rdfs:domain-rdfs:range-rdfs:label-rdfs:comment
rdfs:member-rdf:first-rdf:rest-rdfs:see另见rdfs:isDefinedBy
rdf:值rdf:主语rdf:谓词rdf:对象
}
{res?p?o.bind(?res as?s)}并
{s?res?o.bind(?res as?p)}并
{s?p?res.bind(?res as?o)}
}
如果对一个数据集运行这两个查询,您可能会对数据的结构进行有根据的猜测。请注意,OWL也使用了许多RDFS属性,因此粗略的启发可能是:

  • 如果OWL查询返回的信息比RDFS查询多得多,那么数据可能使用OWL本体;否则,它可能使用RDFS模式(或者根本不使用模式)

您的想法对我来说似乎是有效的,您可以尝试询问OWL构造的列表,看看是否有任何结果。您可以对RDF执行同样的操作。您应该假设可以访问数据的模式(语义Web的核心特征),否则就认为这是一个RDF图。询问“数据源是OWL还是RDF/XML”,并没有太多意义。SPARQL用于查询RDF。RDF/XML是RDF的一种特殊序列化,SPARQL端点如何存储数据无关紧要,只要您可以通过它进行查询。OWL可以在RDF中序列化,因此您可能正在查询某些OWL数据的RDF序列化。当然,某些OWL数据的序列化看起来与“非OWL”数据没有什么不同。例如,。对象属性断言“ArshamMesbah使用StackOverflow”被序列化为三个“ArshamMesbah使用StackOverflow”;如果您正在查询的数据是一些OWL数据的RDF序列化,那么您将看到一些东西,它们是
OWL:Class
es、属性等@JoshuaTaylor我完全理解您所说的,但是这里的目标不是简单地查询知识库,目标是找出关于底层表示的信息(也称为元信息),假设发布者没有发布模式,这是经常发生的情况。@ArshamMesbah我认为解决这个问题的一个有趣的方法可能是提取所有具有属性或对象的三元组,这些属性或对象的URI可以用OWL、RDFS属性缩写。这将基本上为您提供数据集中大部分和模式相关的内容,然后您可以根据其中的内容猜测主要模式语言是什么。请注意,OWL重用了
rdfs:domain
rdfs:range
,因此您可能不关心这些(就确定语言是什么而言)。