如何推断同一个具有相同名称的对象之间的关系

时间:2015-03-18 19:22:40

标签: relationship rdf sparql owl reasoning

我想推断一个owl:sameAs使用RDF推理对属性具有相同值的对象之间的关系。

  • object1 dc:title someTitle
  • object2 dc:title someTitle

推断具有匹配标题的所有对象之间的关系的代码是什么?

另外,当属性不相同时,我可以这样做吗?

  • object1 dc:title someTitle
  • object2 rdf:title someTitle

此致

2 个答案:

答案 0 :(得分:0)

不在RDF或RDFS

中 RDF并没有内置很多语义,虽然RDFS提供了一些语义,但我认为这两者都不足以让你得到你正在寻找的那种推理。但是,由于您正在寻找创建owl:sameAs链接,您可能正在使用OWL推理器,在这种情况下,这不是太难,而且在SPARQL中也非常容易。答案的其余部分涵盖了这两种情况。

在OWL

您只需声明手头的属性是inverse functional (object) property

  

9.2.8 Inverse-Functional Object Properties

     

对象属性反函数公理   InverseFunctionalObjectProperty(OPE)声明了object属性   表达式OPE是反函数的 - 也就是说,对于每个个体x,   最多可以有一个y,y通过OPE连接   用x。

这方面的一个典型例子是任何类型的唯一标识符,例如纳税人ID号。例如,

ex:hasSSN a owl:InverseFunctionalProperty .
:JohnDoe :hasSSN :ssnXXX-XX-XXXX .
:JDoe :hasSSN :ssnXXX-XX-XXXX .

从这些,我们可以用OWL推理推断出

:JohnDoe owl:sameAs :JDoe .

请注意,只有对象属性可以是反函数的(尽管我认为某些reasoners会处理反函数数据类型属性);这意味着你可能需要包装"我上面做的一些值,创建一个IRI个人:ssnXXX-XX-XXX而不是使用字符串" XXX-XX-XXXX"。看到 What's the problem with inverse-functional datatype properties?对于为什么进行了一些讨论。

现在,如果您有两个不同的属性,那么您可以将它们作为某些新属性的子属性,并使新属性反向起作用。例如

:hasSSN rdfs:subPropertyOf :hasTaxpayerIDOrSSN .
:hasTaxpayerID rdfs:subPropertyOf :hasTaxpayerIDOrSSN .
:hasTaxpayerIDOrSSN a owl:InverseFunctionalProperty .

然后从

:JohnDoe :hasSSN :ssnXXX-XX-XXXX .
:JDoe :hasSSN :ssnXXX-XX-XXXX .

你可以推断

:JohnDoe :hasTaxpayerIDOrSSN :ssnXXX-XX-XXXX .
:JDoe    :hasTaxpayerIDOrSSN :ssnXXX-XX-XXXX .

从中,那

:JohnDoe owl:sameAs :JDoe .

在SPARQL

在SPARQL中,这也很简单。首先,要查询一些数据:

@prefix : <urn:ex:> .

:JohnDoe :hasSSN :ssnXXX-XX-XXX .
:JDoe :hasSSN :ssnXXX-XX-XXX .

然后我们可以定义一个简单的构造查询:

prefix : <urn:ex:>
prefix owl: <http://www.w3.org/2002/07/owl#>

construct { ?x owl:sameAs ?y }
where { ?z ^:hasSSN ?x, ?y }
@prefix :      <urn:ex:> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .

:JDoe   owl:sameAs  :JohnDoe , :JDoe .

:JohnDoe  owl:sameAs  :JohnDoe , :JDoe .

如果要使用多个属性,可以在属性路径中使用替换。这里有数据,查询和结果:

@prefix : <urn:ex:> .

:JohnDoe :hasSSN :ssnXXX-XX-XXX .
:JDoe :hasTaxpayerID :ssnXXX-XX-XXX .
prefix : <urn:ex:>
prefix owl: <http://www.w3.org/2002/07/owl#>

construct { ?x owl:sameAs ?y }
where { ?z ^(:hasSSN|:hasTaxpayerID) ?x, ?y }

@prefix :      <urn:ex:> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .

:JDoe   owl:sameAs  :JDoe , :JohnDoe .

:JohnDoe  owl:sameAs  :JDoe , :JohnDoe .

答案 1 :(得分:0)

您可以尝试使用SILK框架:http://wifo5-03.informatik.uni-mannheim.de/bizer/silk/

我已多次成功使用它来查找owl:sameAs来自不同数据集的实体之间的关系(例如,如果您有一个包含省份的数据集,并且您想要查找来自DBpedia的哪些实体具有相同的省名称)。据我所知,您也可以使用它来匹配同一数据集中的元素。

使用SILK的优点是你有几种算法来比较具有相似值的实体(例如,someTitle,some Title,Sometitle和SOMETITLE将匹配)。您可以使用过滤器来获得所需的结果。唯一的缺点是,如果你降低距离值来比较SILK可以匹配像“some Title”和“som Title”这样的值,这可能是错误的,具体取决于你的用例。