gpt4 book ai didi

rdf - RDF 可以对具有边缘属性的标记属性图进行建模吗?

转载 作者:行者123 更新时间:2023-12-02 20:55:43 26 4
gpt4 key购买 nike

我想对如下所示的合作伙伴关系进行建模,我以标记属性图的格式表示。

enter image description here

我想使用RDF语言来表达上面的图,特别是我想了解是否可以表达“loves”边的标签(这是一篇文章/信件的URI)。

我是RDF新手,我知道RDF可以很容易地表达LPG中的节点属性,但是是否可以方便地表达边属性?

这个问题的更多背景信息:我想使用 RDF(而不是 Gremlin)的原因是我想从长远来看添加一些推理能力。

进一步补充的问题:如果我们选择一个RDF模型来表示上述LPG,用简单的英语来说,我想用SPARQL查询回答以下问题:

  1. 鲍勃有爱上任何人吗?
  2. 如果是,他爱谁?为什么?

查询 loveletters.com/123 的 SPARQL 语句有多复杂?

最佳答案

RDF 不支持边属性,因此简单的回答是否定的。当然,有一些方法可以在 RDF 中对此类事物进行建模。

没有边缘属性的普通 RDF 三元组

如果我们不想注释边,Bob 和 Mary 之间的关系将只是一个三元组,其中 Bob 为主语,Mary 为宾语,“loves”为谓语:

PREFIX : <http://example.org/ontology#>
PREFIX person: <http://example.org/data/person/>

person:Bob :loves person:Mary.

那么我们如何添加注释呢?

选项 1:使用 RDF 具体化

RDF 有一个名为“RDF reification”的内置解决方案。它允许对陈述进行陈述:

PREFIX : <http://example.org/ontology#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX person: <http://example.org/data/person/>
PREFIX statement: <http://example.org/data/statement/>

person:Bob :loves person:Mary.

statement:1 a rdf:Statement;
rdf:subject person:Bob;
rdf:predicate :loves;
rdf:object person:Mary;
:reason <http://loveletters.com/123>.

因此,我们说有一个语句,其中 Bob 为主语,Mary 为宾语,“loves”为谓语。然后我们可以向该语句添加属性。缺点是它有点多余。首先我们添加“loves”三元组,然后再添加四个三元组来复制“loves”三元组。

选项 2:将关系建模为实体

另一种方法是改变模型。我们不认为“爱”是人与人之间的边缘,而是将其本身视为一个节点。代表关系的节点,连接到相关的两方。

PREFIX relationship: <http://example.org/data/relationship/>

relationship:1 a :LovesRelationship;
:who person:Bob;
:whom person:Mary;
:reason <http://loveletters.com/123>.

因此,在我们的模型中,我们创建了一个表示“爱”的类 :LovesRelationship,并创建了属性 :who:whom 来指示两党。这种方法的缺点是图结构不再直接代表我们的社交网络。因此,当查询两个人之间的关系时,我们总是必须遍历这些关系实体,而不仅仅是处理连接人的边。

选项 3:使用 RDF*

a proposal called RDF*这很好地解决了这个问题。 (有时它被称为 RDR 或Reification Done Right。)RDF*/RDR 添加了新语法,允许三元组成为其他三元组的主题:

<<person:Bob :loves person:Mary>>
:reason <http://loveletters.com/123>.

缺点是它是非标准的,到目前为止仅受少数系统支持( BlazegraphAnzoGraphan extension for Jena )。截至 2019 年 4 月,海王星并不在其中。

查询:Bob 是否爱上任何人?

这在基本 RDF 版本以及选项 1 和选项 3 中很容易做到:

ASK { person:Bob :loves ?anyone }

由于模型已更改,选项 2 需要不同的查询:

ASK {
?rel a :LovesRelationship;
:who person:Bob.
}

这将匹配 :who 属性为 Bob 的任何 :LovesRelationship,无论 :whom:reason 属性。

查询:鲍勃爱上了谁,为什么?

选项 1,RDF 具体化:

SELECT ?whom ?why {
?statement a rdf:Statement;
rdf:subject person:Bob;
rdf:predicate :loves;
rdf:object ?whom;
:reason ?why.
}

我发现这个查询不太直观,因为它讨论的是 RDF 语句,而我们真正对人和关系感兴趣。

选项 2,将关系建模为实体:

SELECT ?whom ?why {
?rel a :LovesRelationship;
:who person:Bob;
:whom ?whom;
:reason ?why.
}

在我看来这更好;一旦您接受关系是该模型中的实体,它就会变得相当直观。

选项 3,RDF*,使用 SPARQL*:

SELECT ?whom ?why {
<<person:Bob :loves ?whom>>
:reason ?why.
}

这简洁直观,因此遗憾的是我们目前无法在大多数 SPARQL 系统中使用它!

关于rdf - RDF 可以对具有边缘属性的标记属性图进行建模吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55885944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com