我想知道是否有一种标准或普遍接受的方式来表示数据库中用于 RDF 数据的 NULL 等效项。
更具体地说,我对区分属性p的值o的以下情况的方法感兴趣(p是谓词,o是 RDF 三元组的对象):
- 该值不适用,即属性p不存在或在上下文中没有意义。
- 该值是未知的,即它应该存在但我们不知道。
- 价值不存在,即财产没有价值(例如活着的人的死亡年份)。
- 该值是witheld,例如当不允许数据消费者访问它时。
我想知道是否有一种标准或普遍接受的方式来表示数据库中用于 RDF 数据的 NULL 等效项。
更具体地说,我对区分属性p的值o的以下情况的方法感兴趣(p是谓词,o是 RDF 三元组的对象):
我不知道执行此操作的标准方法,但使用 RDF 的优点之一是您在决定如何执行此操作时具有很大的灵活性。RDF本身不能表达否定(即,没有非常方便的方式可以说三重spo不成立),但 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 .
你可能会运行一个健全性检查来寻找既是AnimateObject
s 又InanimateObject
是 s 的东西。如果两者兼而有之,则您可能有一个应该调查的问题。如果您使用 OWL,那么您实际上可以声明AnimateObject
andInanimateObject
是不相交的并检查逻辑一致性。或者,在 OWL 中,您可以添加断言,例如
object82 hasConstructionDate max 0
它说object82
应该没有属性的值hasConstructionDate
。
在任何情况下,将rdfs:comment
s 添加到您的属性中,说明该属性应该用于什么以及不应该用于什么。在适当的时候,rdfs:comment
给个人添加 s 来解释为什么他们不应该对给定的财产有一个价值,如果他们不应该有这样的价值。
2. 值未知,即应该存在但我们不知道。
在这种情况下,确定“应该”的确切含义很重要。例如,在 OWL 中,你可以这样说
Person SubClassof (hasName min 1 String)
断言每一个person
都与至少一个String
通过属性相关hasName
;也就是说,每个人至少有一个名字。这是说有一些价值的一种方式,但我们可能不知道在特定情况下它是什么。如果您不能使用 OWL,而只能使用 RDF,那么您可能应该按照“每个属性都应该有至少一个值
”的rdfs:comment
方式在属性中添加一个。</p>hasName
NamedEntity
3. 价值不存在,即财产没有价值(例如,活着的人的死亡年份)。
这是一个有趣的例子,因为 RDF 没有内置的时间概念(从某种意义上说,一些三元组在给定时间之前保持不变,然后其他一些三元组保持不变)。如果您只是将 RDF 图用作可以更新的类似数据库的存储(通过删除和插入新的三元组),您可能会使用一些特殊的保留值来表示“我还没死!”</a> . 拥有一个开放式数据模型,就像我们在 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:PROV 本体,一个用于描述信息来源的词汇表(例如,它是从什么生成的,归因于什么);它可能有助于描述请求者可能无法以完整形式获得的各种资源。
我在 RDF 中做了一些建模。我知道没有广泛使用的词汇来表示您正在寻找的信息。然而,有一个被广泛接受的模式是适用的。
在我大约一年前所做的工作中,我有一个类似的要求来表示具有“可为空值”的属性。具有可为空值的属性要么具有值,要么具有该值不存在的原因。
我通过引入一个 b 节点作为属性的值来表示这一点。该 b 节点将具有链接到值的 rdf:value 属性,或者链接到值不可用的原因的原因属性,例如
:foo
:aProp [a :nullableValue; rdf:value "value"] ;
:bProp [a :nullableValue; :reason :notAvailable ]
.
就像w3 邮件列表中的其他人指出的那样:不要创建值为“NULL”的三元组。创建三元组时应忽略此数据。
只是想在公共邮件列表中链接有关此问题的讨论。它还提到了此处未提及的其他一些替代方案,例如rdf:nil 的用法。