【问题标题】:Modelling an equivalent of database NULL in RDF在 RDF 中对等效的数据库 NULL 建模
【发布时间】:2013-05-28 05:06:35
【问题描述】:

我想知道是否有一种标准或普遍接受的方式来表示 RDF 数据数据库中使用的 NULL 等价物。

更具体地说,我对区分属性 p 的值 o 的以下情况的方法感兴趣(p 是谓词,o RDF 三元组的对象):

  1. 该值不适用,即属性p不存在或在上下文中没有意义。
  2. 该值为未知,即它应该存在但我们不知道。
  3. 不存在,即该属性没有值(例如,活着的人的死亡年份)。
  4. 值为witheld,例如当不允许数据使用者访问它时。

【问题讨论】:

  • 我认为这个问题会成为Semantic Web proposal 上的一个很好的示例问题。也许你想添加它?
  • @unor 完成,感谢提示
  • 引用:“在数据库中使用 NULL”。您是指 SQL 数据库中使用的 NULL 还是其他一些 NULL 概念? SQL 风格的 NULL 不区分此处列出的不同情况,因此无论您想要什么都不是相当于 SQL 数据库中的 NULL。 SQL 风格的 NULL 是一场灾难。在RDF中模仿SQL的错误是没有意义的。

标签: null data-modeling rdf linked-data


【解决方案1】:

我不知道执行此操作的标准方法,但使用 RDF 的优点之一是您在决定如何执行此操作时具有很大的灵活性。 RDF,per se,不能表达否定(即,没有非常方便的方法可以说三元组 s p o 不成立),但 OWL 可以。对于您描述的四种情况,您可以采取以下几种方法:

1.该值不适用,即属性 p 不存在或在上下文中没有意义。

如果属性 p 对主题 s 具有值没有多大意义,那么不写任何三元组可能是可以接受的spo 的形式。由于RDF做了一个开放世界的假设,在数据检索中,通常只查询自己感兴趣的数据,而不会花太多精力去检查哪里有意想不到的东西。如果您确实想做一些健全性检查,那么您可以为属性声明 RDFS 域和范围。例如,您可能有:

hasBirthDate rdfs:domain AnimateObject .
hasConstructionDate rdfs:domain InanimateObject .

根据语义,如果你有

object82 hasBirthDate "2013-04-01" ;
         hasConstructionDate "2013-04-02" .

那么你也会推断出

object82 a AnimateObject, a InanimateObject .

您可能会运行一个健全性检查来查找AnimateObjects 和InanimateObjects 的内容。如果两者兼而有之,则您可能有一个应该调查的问题。如果您使用 OWL,那么您实际上可以声明 AnimateObjectInanimateObject 不相交并检查逻辑一致性。或者,在 OWL 中,您可以添加断言,例如

object82 hasConstructionDate max 0 

这表示object82 应该没有属性hasConstructionDate 的值。

无论如何,将rdfs:comments 添加到您的属性中,说明该属性应该用于什么以及不应该用于什么。在适当的时候,向个人添加rdfs:comments,以解释为什么他们不应该为给定的属性设置一个值,如果他们不应该有这样的价值的话。

2。该值是未知的,即它应该存在但我们不知道。

在这种情况下,确定“应该”的确切含义很重要。例如,在 OWL 中,您可以这样说

Person SubClassof (hasName min 1 String)

通过属性hasName 断言每个person 至少与一个String 相关;也就是说,每个人至少有一个名字。这是一种说法一些价值,但我们可能不知道它在特定情况下是什么。如果您不能使用 OWL,而只能使用 RDF,那么您可能应该按照“每个 NamedEntity 应该至少有一个该属性的值”的方式,将 rdfs:comment 添加到属性 hasName

3.价值不存在,即财产没有价值(例如活着的人的死亡年份)。

这是一个有趣的例子,因为 RDF 没有内置的时间概念(从某种意义上说,一些三元组在给定时间之前保持不变,然后其他一些三元组保持不变)。如果您只是将 RDF 图用作可以更新的类似数据库的存储(通过删除和插入新的三元组),您可能会为 “I'm not dead yet!” 使用一些特殊的保留值。拥有一个开放式数据模型,就像我们在 RDF 中所做的那样,使得做这样的事情变得特别容易,因为你真的可以为它使用一些新的价值:

mp:JohnCleese hasDeathDate mp:notDeadYet .
mp:GrahamChapman hasDeathDate "1989-10-04" .

当然,您也可以更精细一些,使用布尔值属性来指示第一个属性的值是否有意义:

mp:JohnCleese isDeceased "false" .
mp:GrahamChapman isDeceased "true" ;
                 hasDeathDate "1989-10-04" .

4.该值被保留,例如,当不允许数据使用者访问它时。

在我看来,这是最有趣的案例,因为它可能涉及最有趣的数据转换。如果你有一个很好的数据集供人们查询,并且你想指出他们将获得的结果,除了他们缺乏许可,你有很多选择来表示这一点。例如,您可以使用 HTTP 状态代码之类的东西来将图中的节点替换为充当编辑的空白节点。例如,您可能拥有以下数据:

ex:JohnDoe hasSSN "000-00-0000" .
ex:JaneDoe hasSSN "000-00-0001" .

当有人要数据时,你可能会回应(假设第一个值有效,第二个无效):

ex:JohnDoe hasSSN [ a ex:ValidSSN ] .
ex:JaneDoe hasSSN [ a ex:InvalidSSN ] .

一般而言,您可以向消费者展示与您实际拥有的数据不同的数据视图。我不知道做这种事情的任何标准。您可能对最近的 W3C 推荐 PROV-O: The PROV Ontology 感兴趣,这是一个描述信息来源的词汇表(例如,它是从什么生成的,它归属于什么);它可能有助于描述请求者可能无法以完整形式获得的各种资源。

【讨论】:

  • 我感兴趣的主要是数据消费者的观点,当我从未知来源接收数据时,我是否可以期待一些“标准”的东西。对我来说最有趣的建议是 (3) - 我应该在我的用例中考虑属性依赖关系!无论如何,您的回答将对以后的参考非常有帮助。谢谢!
【解决方案2】:

我在 RDF 中做了一些建模。我知道没有广泛使用的词汇来表示您正在寻找的信息。然而,有一种被广泛接受的适用模式。

在我大约一年前所做的工作中,我有一个类似的要求来表示具有“可空值”的属性。具有可为空值的属性要么具有值,要么具有该值不存在的原因。

我通过引入一个 b 节点作为属性的值来表示这一点。该 b 节点将具有链接到值的 rdf:value 属性,或者链接到值不可用的原因的原因属性,例如

:foo
   :aProp [a :nullableValue; rdf:value "value"] ;
   :bProp [a :nullableValue; :reason :notAvailable ]
.

【讨论】:

  • 不错的解决方案。支持 Joshua 在第 (4) 点中的建议。谢谢!
  • 这是对不常见的rdf:value 的一个很好的使用。 RDF 底漆有a simple example 的用途。
【解决方案3】:

就像w3 mailing list 上的其他人指出的那样:不要创建值为“NULL”的三元组。创建三元组时应忽略此数据。

【讨论】:

    【解决方案4】:

    只是想在公共邮件列表中链接the discussion on this problem。它还提到了这里没有提到的其他一些替代方案,比如usage of rdf:nil

    【讨论】:

    • 谢谢。讨论结束后,我也将结论放在这里。
    • @Mifeet 讨论看起来有点安静(看起来最后的消息是 9 天前);你有什么更新要告诉我们吗?
    • @Joshua 我在国外离线了几个星期,我在阅读我的邮件。我会尽快总结一下。
    • 讨论缺乏真正的结论性共识。一个反复出现的想法是,您不应该为您不知道的数据创建三元组。您可以使用空白节点来表示某事物具有一个未知的值。
    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多