Rdf 处理三元组的重复 形势

Rdf 处理三元组的重复 形势,rdf,semantic-web,Rdf,Semantic Web,假设我们有两个三重文件,如下所示: data1.triple(来自“数据源A”) 前缀:personX vocab:名称“X”。 前缀:personX vocab:出生日期“2000-01-01”。 数据2.triple(来自“数据源B”) 前缀:personX vocab:名称“X”。 前缀:personX vocab:出生日期“2000-01-01”。 由于数据1和数据2完全相同,name和birthdate将分别导入一次 但是如果data1和data2的personX的出生日期

假设我们有两个三重文件,如下所示:

  • data1.triple(来自“数据源A”)
    
    前缀:personX vocab:名称“X”。
    前缀:personX vocab:出生日期“2000-01-01”。
    

  • 数据2.triple(来自“数据源B”)
    
    前缀:personX vocab:名称“X”。
    前缀:personX vocab:出生日期“2000-01-01”。
    

由于数据1和数据2完全相同,
name
birthdate
将分别导入一次

但是如果data1和data2的personX的出生日期值不同,会怎样呢

  • data1.triple(来自“数据源A”)
    
    前缀:personX vocab:名称“X”。
    前缀:personX vocab:出生日期“2000-01-01”。
    
  • 数据2.triple(来自“数据源B”)
    
    前缀:personX vocab:名称“X”。
    前缀:personX vocab:生日“1999-01-01”。
    
在本例中,我只想加载“2000-01-01”或“1999-01-01”中的一个,因为有两个出生日期是没有意义的

问题: 是否有任何机制、指令或任何类型的概念需要描述:

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

因此,“personX”的“name”谓词只有一次。

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

  • “数据源A”的优先级高于“数据源B”
如果将RDF数据集与命名图一起使用(这在SPARQL中非常常见),则可以将每个源中的数据放入命名图中,然后可以从优先级高于其他源的数据集中进行选择。例如,类似于:

select?生日{
值(?优先级?图){(1:A)(2:B)}
图?图{:人:生日?生日}
}
按顺序?优先顺序
限制1
然后,在从图B中获取任何生日属性之前,先从图A中获取任何生日属性

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

选择(合并(?birthdateA,?birthdateB)作为生日){
图:A{:人:生日?生日A}
图:B{:人:生日?生日B}
}
  • “某些谓词每一个实体应有一条边”
使用SPARQL很容易检查违规行为。您可以这样做来识别有问题的数据:

select?坏人{
坏人:生日?生日
}
坏人分组
有(计数(不同的?出生日期)!=1)
要指定只有一个值,您需要开始使用本体语言,例如OWL,您可以在其中声明,例如:

子类(确切地说是出生日期


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

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

  • “数据源A”的优先级高于“数据源B”
如果将RDF数据集与命名图一起使用(这在SPARQL中非常常见),则可以将每个源中的数据放入命名图中,然后可以从优先级高于其他源的数据集中进行选择。例如,类似于:

select?生日{
值(?优先级?图){(1:A)(2:B)}
图?图{:人:生日?生日}
}
按顺序?优先顺序
限制1
然后,在从图B中获取任何生日属性之前,先从图A中获取任何生日属性

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

选择(合并(?birthdateA,?birthdateB)作为生日){
图:A{:人:生日?生日A}
图:B{:人:生日?生日B}
}
  • “某些谓词每一个实体应有一条边”
使用SPARQL很容易检查违规行为。您可以这样做来识别有问题的数据:

select?坏人{
坏人:生日?生日
}
坏人分组
有(计数(不同的?出生日期)!=1)
要指定只有一个值,您需要开始使用本体语言,例如OWL,您可以在其中声明,例如:

子类(确切地说是出生日期


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

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

  • “数据源A”的优先级高于“数据源B”
如果将RDF数据集与命名图一起使用(这在SPARQL中非常常见),则可以将每个源中的数据放入命名图中,然后可以从优先级高于其他源的数据集中进行选择。例如,类似于:

select?生日{
值(?优先级?图){(1:A)(2:B)}
图?图{:人:生日?生日}
}
按顺序?优先顺序
限制1
然后,在从图B中获取任何生日属性之前,先从图A中获取任何生日属性

小范围