繁体   English   中英

Sparql - 将限制条件应用于谓词

[英]Sparql - Applying limiting criteria to predicates

我对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:Freemason知道e:Freemason只有e:Freemason

所以:

  • Marty通过Eugene了解Mike,他们都是Freemason,所以没关系
  • 马蒂知道尤金,他有一位平民朋友保罗。 保罗有一个共济会的朋友艾伦。 然而,马蒂没有“只有共济会”的路径,所以他应该被排除在外。

这是我的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

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

我如何修改查询以排除Alan?

我不知道纯SPARQL中的解决方案,抱歉。 在OpenLink Virtuoso的SP​​ARQL-BI中,解决方案就是这个查询

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> )
  }

- 有了这些结果 -

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

这是一个使用SPARQL的例子,该规范已经从规范中弃用(出于我从未理解的原因)但在Virtuoso中仍然受到支持(对于不可预见的未来将是如此)

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

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

实时链接:

  1. 查询解决方案
  2. 查询定义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM