【问题标题】:Sparql - Applying limiting criteria to predicatesSparql - 将限制标准应用于谓词
【发布时间】:2016-07-28 16:29:30
【问题描述】:

我对 RDF / Sparql 还很陌生,因此对于任何不正确的术语以及以下相当糟糕的示例深表歉意:

给定以下 RDF 数据集:

@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix e:     <http://www.example.com/#> .
@prefix foaf:  <http://xmlns.com/foaf/0.1/> .

e:Freemason a owl:Class .
e:Civilian a owl:Class .

e:Marty a e:Freemason .
e:Eugene a e:Freemason .
e:Mike a e:Freemason .
e:Alan a e:Freemason .

e:Paul a e:Civilian .

e:Marty foaf:knows e:Eugene .
e:Eugene foaf:knows e:Mike .
e:Eugene foaf:knows e:Paul .
e:Paul foaf:knows e:Alan .

我正在尝试识别 e:Marty 仅通过其他 e:Freemasons 认识的朋友的朋友。

所以:

  • Marty 通过 Eugene 认识 Mike,他们都是共济会的,所以没关系
  • Marty 认识 Eugene,他有一个平民朋友 Paul。保罗有一个共济会朋友艾伦。然而,Marty 并没有通往 Alan 的“仅限共济会”路径,因此他应该被排除在外。

这是我的 SPARQL 查询:

prefix e: <http://www.example.com/#>
prefix foaf:  <http://xmlns.com/foaf/0.1/>

SELECT *
{
  <http://www.example.com/#Marty> foaf:knows+ ?target .
  ?target a e:Freemason .
}

这会返回:

 http://www.example.com/#Eugene
 http://www.example.com/#Mike
 http://www.example.com/#Alan

在这里,Alan 被包括在内,因为他符合 is-a-freemason 标准。

如何修改查询以排除 Alan?

【问题讨论】:

  • 我没有马上给你答案,但我几乎可以肯定你不能在一个查询中做到这一点。如果它可能的,那肯定是一个相当复杂的 SPARQL 查询。
  • 我认为 Jeen 是对的;我认为你不能用一个 sparql 查询来做到这一点。我想你正在使用一个支持查询 CONSTRUCTed 数据的端点(我认为 dot net RDF 可以,但我不知道是否有其他的)那么这是对构造数据的简单查询。
  • 您可以通过对 CONSTRUCT 数据的查询来做到这一点。有关一些想法,请参阅stackoverflow.com/questions/17363199/… 和我的答案中的一些 cmets。您需要一个 isSelfFreemason 属性,而不是 self isIRI 属性。这是一种罗化。

标签: sparql rdf jena


【解决方案1】:

我不知道纯 SPARQL 中的解决方案,抱歉。 在 OpenLink Virtuoso 的 SPARQL-BI 中,解决方案是this query

prefix e: <http://www.example.com/#>
prefix foaf:  <http://xmlns.com/foaf/0.1/>
select * 
where
  {
    { select ?orig ?target 
      where
       { ?orig   foaf:knows ?target . 
         ?target a          e:Freemason .
       } 
    } 
    option ( TRANSITIVE, 
             T_IN(?orig), 
             T_OUT(?target), 
             T_DISTINCT, 
             T_MIN(1)
           )
    filter ( ?orig = <http://www.example.com/#Marty> )
  }

-- 与these results--

orig                               target
<http://www.example.com/#Marty>    <http://www.example.com/#Eugene>
<http://www.example.com/#Marty>    <http://www.example.com/#Mike>

【讨论】:

    【解决方案2】:

    这是一个使用 SPARQL 的示例,该示例已从规范中弃用(出于我从未理解的原因),但仍受 Virtuoso 支持(在不可预见的未来将是这种情况)

    ## RDF-Turtle Start ##
    
    @prefix owl:   <http://www.w3.org/2002/07/owl#> .
    @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix e:     <http://www.example.com/#> .
    @prefix foaf:  <http://xmlns.com/foaf/0.1/> .
    
    e:Freemason a owl:Class .
    e:Civilian a owl:Class .
    
    e:Marty a e:Freemason .
    e:Eugene a e:Freemason .
    e:Mike a e:Freemason .
    e:Alan a e:Freemason .
    
    e:Paul a e:Civilian .
    
    e:Marty foaf:knows e:Eugene .
    e:Eugene foaf:knows e:Mike .
    e:Eugene foaf:knows e:Paul .
    e:Paul foaf:knows e:Alan .
    
    ## RDF-Turtle End ##
    

    使用已弃用的 SPARQL 中的属性路径模式

    但保存在 Virtuoso 中

    PREFIX e: <http://kingsley.idehen.net/DAV/home/kidehen/Public/Linked%20Data%20Documents/Tutorials/club-member-test.ttl#>
    PREFIX dsn: <http://kingsley.idehen.net/DAV/home/kidehen/Public/Linked%20Data%20Documents/Tutorials/club-member-test.>
    PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
        
    SELECT *
    FROM dsn:ttl
    WHERE {
           e:Marty foaf:knows{2} ?target .
           ?target a e:Freemason .
          }
    

    实时链接:

    1. Query Solution
    2. Query Definition

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多