【问题标题】:Can RDF model a labeled property graph with edge properties?RDF 可以对带有边缘属性的标记属性图进行建模吗?
【发布时间】:2019-09-17 01:12:02
【问题描述】:

我想将合作伙伴关系建模如下,我用标记属性图的格式表示。

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

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

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

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

  1. 鲍勃爱上谁了吗?
  2. 如果是这样,他爱上了谁,为什么?

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

【问题讨论】:

  • 您也可以将该属性用作 RDF 三元组的主题。但是在你的情况下,你必须使用具体化,因为你想对一个特定的三元组做一个陈述。最近,(好吧,工作在 2013/14 iirc 的某个地方开始)Olaf Hartig 和其他一些人介绍了一种称为 RDF* 和 SPARQL* 的替代方案,您基本上可以在主语或宾语位置使用完整的 RDF 三元组。最近的一篇博文是here - 也就是说,三重商店必须支持这种非标准语言扩展。
  • Jena 和 Blazegraph 到目前为止确实支持 RDF*/SPARQL*。此外,在标准推理过程中,我提到的所有方法都不会被考虑在内(至少不会被 RDFS、OWL RL 或其他任何东西考虑在内)
  • @AKSW 小修正:Blazegraph 和 AnzoGraph 支持 RDF*。 Jena 没有,但 there is an open-source project 扩展了 Jena 并支持 RDF*。
  • @ 好的,是的 - 抱歉,它是 Jena 的扩展。以为它已经进入了主要项目。看着这个项目,我想知道它是否真的可以用作扩展,即与 Fuseki 结合使用。该项目还需要与 Jena main 保持同步。

标签: rdf graph-databases gremlin amazon-neptune


【解决方案1】:

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 物化”的内置解决方案。它允许对语句进行语句:

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 属性如何。

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

选项 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 系统中使用它!

【讨论】:

  • 非常感谢您的详细解释!通过查看上述三个选项,在我看来,我应该使用选项 1,因为我想要一个简单的模型(希望以后能够对我的图表进行推理/推断)。使用选项一,reason &lt;http://loveletters.com/123&gt; 是否可以轻松查询出来? -- 让我更新一下我的问题,如果您能给出更新的答案,将不胜感激。
  • @chen 我已经扩展了答案。
  • 如何以xml格式建模??有什么建议吗?
【解决方案2】:

AnzoGraph 支持 RDF*/SPARQL*,因此您实际上可以使用简洁、最直观的格式来表示数据并进行查询。

insert data {
  :Bob a :Person; <name> "Bob"; <state> "CA" .
  :Mary a :Person; <name> "Mary"; <state> "CA" .
  :Bob <loves> :Mary .
  << :Bob <loves> :Mary >> <reason> <http://loveletters.com/123> .
}

现在查询:

select ?who ?whom ?reason
where {
  ?p1 a :Person ; <name> ?who .
  ?p2 a :Person ; <name> ?whom .
  << ?p1 <loves> ?p2 >> <reason> ?reason .
}

结果:

 who | whom | reason                     
-----+------+----------------------------
 Bob | Mary | http://loveletters.com/123 
1 rows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多