代码之家  ›  专栏  ›  技术社区  ›  chen

RDF能为以下有标签的属性图用例建模吗?

  •  0
  • chen  · 技术社区  · 5 年前

    我想像下面这样对合作伙伴关系建模,我用带标签的属性图的格式表示。

    enter image description here

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

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

    这个问题的背景是:我想使用RDF(而不是Gremlin)的原因是我想在长期内增加一些推理能力。

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

    SPARQL语句查询出 loveletters.com/123

    0 回复  |  直到 5 年前
        1
  •  17
  •   cygri    5 年前

    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>.
    

    选项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或 物化做得对 .RDF*/RDR添加了新语法,允许三元组成为其他三元组的主题:

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

    缺点是它是非标准的,到目前为止只有少数系统支持( Blazegraph , AnzoGraph an extension for Jena ). 截至2019年4月,海王星不在其中。

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

    ASK { person:Bob :loves ?anyone }
    

    选项2需要不同的查询,因为更改了模型:

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

    :爱情关系 在哪里 :谁 :谁 :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.
    }
    

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

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

    这是简洁和直观的,所以很遗憾我们目前不能在大多数SPARQL系统中使用它!

        2
  •  0
  •   SPARQL User    4 年前

    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