如何在 RDF 中表达有关关系的附加信息(时间、概率)?
How can I express additional information (time, probability) about a relation in RDF?
我知道我可以将任何关系表示为 RDF 三元组,如:
Barack Obama -> president of -> USA
(我知道这不是 RDF,我只是在说明)
但是我如何添加有关此关系的其他信息,例如时间维度?我的意思是他正处于他的第二个总统任期,任何时期都只会持续一段时间。而且,在他的总统任期之后和之前怎么样?
有多种选择可以做到这一点。我会举例说明一些比较流行的。
命名图/四边形
在 RDF 中,命名图是 RDF 数据集的子集,它们被分配了特定的标识符 ("graph name")。在大多数 RDF 数据库中,这是通过向 RDF 三元组添加第四个元素,将其从三元组变成 "quad"(有时也称为三元组的 'context')来实现的。
您可以使用此机制来表达关于 某个语句集合的信息。例如(对 RDF 使用伪 N-Quads 语法):
:i1 a :TimePeriod .
:i1 :begin "2009-01-20T00:00:00Z"^^xsd:dateTime .
:i1 :end "2017-01-20T00:00:00Z"^^xsd:dateTime .
:barackObama :presidentOf :USA :i1 .
注意最后一个语句中的第四个元素:它将语句 "Barack Obama is president of the USA" 链接到由 :i
标识的命名图。
命名图方法在您有数据可以同时表达多个语句的情况下特别有用。当然也可以将它用于有关 个人 语句的数据(如上例所示),但如果以这种方式使用它可能很快就会变得麻烦(每个不同的时间段都需要它自己的命名图)。
将关系表示为对象
另一种方法是将关系本身建模为对象。 "Barack Obama"和"USA"之间的关系不仅仅是一个是另一个总统,而是在某些日期之间是另一个总统。在 RDF 中表达这一点(正如 Joshua Taylor 在他的评论中所说明的那样):
:barackObama :hasRole :president_44 .
:president_44 a :Presidency ;
:of :USA ;
:begin "2009-01-20T00:00:00Z"^^xsd:dateTime ;
:end "2017-01-20T00:00:00Z"^^xsd:dateTime .
关系本身现在变成了一个对象("Presidency" class 的实例,标识符为 :president_44
)。
与使用命名图相比,这种方法更适合断言关于单个语句的数据。一个可能的缺点是查询 SPARQL 中的关系变得有点复杂。
RDF 具体化
不确定这种方法实际上仍然算作 "popular",但 RDF 具体化是历史上 W3C 认可的断言方法 "statements about statements"。在这种方法中,我们将语句本身变成一个对象:
:obamaPresidency a rdf:Statement ;
rdf:subject :barackObama ;
rdf:predicate :presidentOf ;
rdf:object :USA ;
:trueBetween [
:begin "2009-01-20T00:00:00Z"^^xsd:dateTime ;
:end "2017-01-20T00:00:00Z"^^xsd:dateTime .
] .
然而,在这种情况下有几个不使用 RDF 具体化的充分理由:
- 概念上有点奇怪。我们想要表达的知识是关于关系的时间方面的,但是使用RDF具体化我们是在谈论 ]声明。
- 我们在上面的例子中表达的是:"the statement about Barack Obama being president of the USA is valid between ... and ..."。请注意,我们 而不是 表示巴拉克奥巴马实际上 是 美国总统!当然,您仍然可以单独断言(只需添加原始三元组和具体化的三元组),但这会产生进一步的 duplication/maintenance 问题。
- 在 SPARQL 查询中使用起来很痛苦。
正如 Joshua 在他的评论中指出的那样,W3C Note on defining N-ary RDF relations 值得一看,因为它更深入地介绍了这些(和其他)方法。
我知道我可以将任何关系表示为 RDF 三元组,如:
Barack Obama -> president of -> USA
(我知道这不是 RDF,我只是在说明)
但是我如何添加有关此关系的其他信息,例如时间维度?我的意思是他正处于他的第二个总统任期,任何时期都只会持续一段时间。而且,在他的总统任期之后和之前怎么样?
有多种选择可以做到这一点。我会举例说明一些比较流行的。
命名图/四边形
在 RDF 中,命名图是 RDF 数据集的子集,它们被分配了特定的标识符 ("graph name")。在大多数 RDF 数据库中,这是通过向 RDF 三元组添加第四个元素,将其从三元组变成 "quad"(有时也称为三元组的 'context')来实现的。
您可以使用此机制来表达关于 某个语句集合的信息。例如(对 RDF 使用伪 N-Quads 语法):
:i1 a :TimePeriod .
:i1 :begin "2009-01-20T00:00:00Z"^^xsd:dateTime .
:i1 :end "2017-01-20T00:00:00Z"^^xsd:dateTime .
:barackObama :presidentOf :USA :i1 .
注意最后一个语句中的第四个元素:它将语句 "Barack Obama is president of the USA" 链接到由 :i
标识的命名图。
命名图方法在您有数据可以同时表达多个语句的情况下特别有用。当然也可以将它用于有关 个人 语句的数据(如上例所示),但如果以这种方式使用它可能很快就会变得麻烦(每个不同的时间段都需要它自己的命名图)。
将关系表示为对象
另一种方法是将关系本身建模为对象。 "Barack Obama"和"USA"之间的关系不仅仅是一个是另一个总统,而是在某些日期之间是另一个总统。在 RDF 中表达这一点(正如 Joshua Taylor 在他的评论中所说明的那样):
:barackObama :hasRole :president_44 .
:president_44 a :Presidency ;
:of :USA ;
:begin "2009-01-20T00:00:00Z"^^xsd:dateTime ;
:end "2017-01-20T00:00:00Z"^^xsd:dateTime .
关系本身现在变成了一个对象("Presidency" class 的实例,标识符为 :president_44
)。
与使用命名图相比,这种方法更适合断言关于单个语句的数据。一个可能的缺点是查询 SPARQL 中的关系变得有点复杂。
RDF 具体化
不确定这种方法实际上仍然算作 "popular",但 RDF 具体化是历史上 W3C 认可的断言方法 "statements about statements"。在这种方法中,我们将语句本身变成一个对象:
:obamaPresidency a rdf:Statement ;
rdf:subject :barackObama ;
rdf:predicate :presidentOf ;
rdf:object :USA ;
:trueBetween [
:begin "2009-01-20T00:00:00Z"^^xsd:dateTime ;
:end "2017-01-20T00:00:00Z"^^xsd:dateTime .
] .
然而,在这种情况下有几个不使用 RDF 具体化的充分理由:
- 概念上有点奇怪。我们想要表达的知识是关于关系的时间方面的,但是使用RDF具体化我们是在谈论 ]声明。
- 我们在上面的例子中表达的是:"the statement about Barack Obama being president of the USA is valid between ... and ..."。请注意,我们 而不是 表示巴拉克奥巴马实际上 是 美国总统!当然,您仍然可以单独断言(只需添加原始三元组和具体化的三元组),但这会产生进一步的 duplication/maintenance 问题。
- 在 SPARQL 查询中使用起来很痛苦。
正如 Joshua 在他的评论中指出的那样,W3C Note on defining N-ary RDF relations 值得一看,因为它更深入地介绍了这些(和其他)方法。