处理三元组的重复

时间:2015-05-20 03:18:59

标签: rdf semantic-web

情况

假设我们有2个这样的三重文件:

  • data1.triple(来自“数据源A”) prefix:personX vocab:name "X". prefix:personX vocab:birthdate "2000-01-01".

  • data2.triple(来自“数据源B”) prefix:personX vocab:name "X". prefix:personX vocab:birthdate "2000-01-01".

由于data1和data2非常相同,namebirthdate中的每一个都会被导入一次。

但是,如果data1和data2具有personX的出生日期差异值,那该怎么办:

  • data1.triple(来自“数据源A”) prefix:personX vocab:name "X". prefix:personX vocab:birthdate "2000-01-01".
  • data2.triple(来自“数据源B”) prefix:personX vocab:name "X". prefix:personX vocab:birthdate "1999-01-01".

在这种情况下,我只想加载“2000-01-01”或“1999-01-01”之一,因为有2个出生日期没有意义。

问题

是否有任何机制或指令或任何形式的概念要描述:

  • “某个谓词应该每个实体有一个边缘”
  • “数据源A”的优先级高于“数据源B”

这样'personX'只有一个'name'谓词。

1 个答案:

答案 0 :(得分:3)

没有什么可以让你限制数据中出现的内容。 RDF是一组三元组,这就是你得到的。但是,这并不意味着你没有希望。让我们先解决你的第二个问题:

  
      
  • “数据源A”的优先级高于“数据源B”
  •   

如果您使用带有命名图的RDF数据集(这与SPARQL非常相似),您可以将来自每个源的数据放入命名图中,然后您可以选择优先级高于其他源的数据。 。例如:

select ?birthdate {
  values (?priority ?graph) { (1 :A) (2 :B) }
  graph ?graph { :person :birthdate ?birthdate }
}
order by ?priority
limit 1

然后,您可以从图表A中获取任何生日属性,然后再从图表B中获取任何生日值。

一种不太可扩展的方法,但如果您只有两个图表并且您知道每个图表中最多只有一个值将使用coalesce,则仍然适用:

select (coalesce(?birthdateA, ?birthdateB) as ?birthdate) {
  graph :A { :person :birthdate ?birthdateA }
  graph :B { :person :birthdate ?birthdateB }
}
  
      
  • “某个谓词应该每个实体有一个边缘”
  •   

使用SPARQL轻松检查是否存在违规行为。您只需执行以下操作即可识别有问题的数据:

select ?badPerson {
  ?badPerson :birthdate ?birthdate
}
group by ?badPerson
having (count(distinct ?birthdate) != 1)

要指定只应该有一个值,您需要开始使用本体语言,例如OWL,例如,您可以声明:

SubClassOf (hasBirthdate 完全 1)

现在,这不会阻止某人声明不一致的数据,但支持数据类型推理的OWL推理器将能够识别出现的不一致。