处理三元组的重复
Handling duplication of Triples
情况
假设我们有 2 个这样的三重文件:
data1.triple(来自"data source A")
prefix:personX vocab:name "X".
prefix:personX vocab:birthdate "2000-01-01".
data2.triple(来自"data source B")
prefix:personX vocab:name "X".
prefix:personX vocab:birthdate "2000-01-01".
因为data1和data2完全相同,所以name
和birthdate
各导入一次
但是,如果 data1 和 data2 的 personX 的出生日期的差异值是这样的:
- data1.triple(来自"data source A")
prefix:personX vocab:name "X".
prefix:personX vocab:birthdate "2000-01-01".
- data2.triple(来自"data source B")
prefix:personX vocab:name "X".
prefix:personX vocab:birthdate "1999-01-01".
在这种情况下,我只想加载“2000-01-01”或“1999-01-01”之一,因为有 2 个出生日期没有意义。
问题
是否有任何机制或指令或任何类型的概念来描述:
- "some predicate should have one edge per one Entity"
- "data source A" 的优先级高于 "data source B's"
因此 '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 推理器将能够识别出现的不一致。
情况
假设我们有 2 个这样的三重文件:
data1.triple(来自"data source A")
prefix:personX vocab:name "X". prefix:personX vocab:birthdate "2000-01-01".
data2.triple(来自"data source B")
prefix:personX vocab:name "X". prefix:personX vocab:birthdate "2000-01-01".
因为data1和data2完全相同,所以name
和birthdate
各导入一次
但是,如果 data1 和 data2 的 personX 的出生日期的差异值是这样的:
- data1.triple(来自"data source A")
prefix:personX vocab:name "X". prefix:personX vocab:birthdate "2000-01-01".
- data2.triple(来自"data source B")
prefix:personX vocab:name "X". prefix:personX vocab:birthdate "1999-01-01".
在这种情况下,我只想加载“2000-01-01”或“1999-01-01”之一,因为有 2 个出生日期没有意义。
问题
是否有任何机制或指令或任何类型的概念来描述:
- "some predicate should have one edge per one Entity"
- "data source A" 的优先级高于 "data source B's"
因此 '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 推理器将能够识别出现的不一致。