Neo4j 如何在RDF中表达有关关系的附加信息(时间、概率)?

Neo4j 如何在RDF中表达有关关系的附加信息(时间、概率)?,neo4j,rdf,semantic-web,Neo4j,Rdf,Semantic Web,我知道我可以将任何关系表示为RDF三元组,如下所示: 巴拉克•奥巴马->美国总统->美国 (我知道这不是RDF,我只是举例说明) 但是我如何添加关于这种关系的附加信息,例如时间维度?我的意思是,他正处于第二个总统任期,任何时期都只会持续一段时间。那么,在他担任总统期间之后和之前呢?有几种选择。我将举例说明一些比较流行的方法 命名图/四边形 在RDF中,命名图是RDF数据集的子集,该数据集被分配了一个特定的标识符(“图名”)。在大多数RDF数据库中,这是通过向RDF三元组添加第四个元素来实现的,将

我知道我可以将任何关系表示为RDF三元组,如下所示:

巴拉克•奥巴马->美国总统->美国

(我知道这不是RDF,我只是举例说明)


但是我如何添加关于这种关系的附加信息,例如时间维度?我的意思是,他正处于第二个总统任期,任何时期都只会持续一段时间。那么,在他担任总统期间之后和之前呢?

有几种选择。我将举例说明一些比较流行的方法

命名图/四边形 在RDF中,命名图是RDF数据集的子集,该数据集被分配了一个特定的标识符(“图名”)。在大多数RDF数据库中,这是通过向RDF三元组添加第四个元素来实现的,将其从三元组转换为“四元组”(有时也称为三元组的“上下文”)

您可以使用此机制来表示有关特定语句集合的信息。例如(对RDF使用伪N-Quads语法):

请注意最后一个语句中的第四个元素:它将“巴拉克·奥巴马是美国总统”的语句链接到由
:i
标识的命名图

命名图方法在有数据同时表示多个语句的情况下特别有用。当然,也可以将其用于有关单个语句的数据(如上面的示例所示),但如果以这种方式使用,可能会很快变得很麻烦(每个不同的时间段都需要自己的命名图)

将关系表示为对象 另一种方法是将关系本身建模为对象。“巴拉克·奥巴马”和“美国”之间的关系不仅仅是一方是另一方的总统,而是一方在特定日期之间是另一方的总统。为了用RDF表达这一点(约书亚·泰勒在他的评论中也说明了这一点):

关系本身现在已成为一个对象(“Presidence”类的实例,标识符为
:president_44

与使用命名图相比,这种方法更适合于断言有关单个语句的数据。一个可能的缺点是,在SPARQL中查询关系变得有点复杂

RDF物化 不确定这种方法是否仍然算是“流行的”,但RDF具体化是W3C认可的断言“关于语句的语句”的历史方法。在这种方法中,我们将语句本身转换为对象:

 :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具体化,我们是在说关于语句的一些东西
  • 我们在上面的例子中所表达的是:“关于巴拉克·奥巴马(Barack Obama)担任美国总统的声明在……和……之间有效。”。请注意,我们没有表示巴拉克·奥巴马实际上是美国总统!当然,您仍然可以单独声明(只需添加原始的三元组以及具体化的三元组),但这会造成进一步的复制/维护问题
  • 在SPARQL查询中使用它是一件痛苦的事情
    正如Joshua在他的评论中所指出的那样,随着对这些(和其他)方法进行更深入的研究,这一点非常有用

    这对于堆栈溢出来说可能太宽了。你有很多选择。您可以将数据存储在数据集中,并使用命名图捕获某些内容。或者你可以把它变成一种n元关系:
    :奥巴马:hasRole[:type:President;:country:USA;:begin…;:end…]
    。谢谢@JoshuaTaylor你能给我指一本参考书或一本书吗?我真的没有谷歌做得更好,所以你可以看看经典。对于数据集,当谈到RDF时,请看一看.Neophyte,但我的第一反应是president is text book类对象。事实上,您似乎可以在多年后验证日期值。@说实话,xtian不确定您得到的是什么。哎呀。在我上班的路上使用火车上的StackApp——我想对OP进行评论。基本上我是在建议,正如你回答的“另一种方法是将关系本身建模为对象”。即使你对RDF定义一无所知,这个问题具有类对象的典型例子的特点。顺便说一句,谷歌对这些方法都不满意,所以他们开始对@berezovskiy感兴趣。愚蠢的方法——RDF的全部目的就是要有一个可互操作的标准。但是很有趣。
    :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 .
    
     :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 .
             ] .