处理三元组的重复

Handling duplication of Triples

情况

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

因为data1和data2完全相同,所以namebirthdate各导入一次

但是,如果 data1 和 data2 的 personX 的出生日期的差异值是这样的:

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

问题

是否有任何机制或指令或任何类型的概念来描述:

因此 'personX' 正好有一次 'name' 谓词。

没有任何东西可以让您限制数据中可以出现的内容。 RDF 是一组三元组,这就是您得到的全部内容。但是,这并不意味着您没有希望。让我们先回答你的第二个问题:

  • "data source A" has a higher precedence than "data source B's"

如果您使用带有命名图的 RDF 数据集,这在 SPARQL 中很常见,您可以将每个来源的数据放入一个命名图中,然后您可以 select 从一个优先级高于另一个。例如,类似于:

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

那么在从图 B 获取任何生日属性之前,您将从图 A 获取任何生日属性。

一种可扩展性较差的方法,但如果您只有两个图形并且您知道每个图形中最多有一个值,则仍然适用 coalesce:

select (coalesce(?birthdateA, ?birthdateB) as ?birthdate) {
  graph :A { :person :birthdate ?birthdateA }
  graph :B { :person :birthdate ?birthdateB }
}
  • "some predicate should have one edge per one Entity"

使用 SPARQL 检查 违规行为很容易。您只需执行类似这样的操作即可 识别 有问题的数据:

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

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

SubClassOf(有出生日期 正好 1)

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