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

Sparql-将限制条件应用于谓词,sparql,rdf,jena,Sparql,Rdf,Jena,我是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:

我是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 .
这将返回:

 http://www.example.com/#Eugene
 http://www.example.com/#Mike
 http://www.example.com/#Alan
这里,艾伦符合is-a-共济会的标准,因此被包括在内


如何修改查询以排除Alan?

对不起,我不知道纯SPARQL中的解决方案。 在OpenLink Virtuoso的SPARQL-BI中,解决方案是

-与-


下面是一个使用SPARQL的示例,由于我不理解的原因,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 .
}
实时链接:


我现在没有答案给你,但我几乎可以肯定,你不能在一个单一的查询。如果可能的话,这肯定是一个相当复杂的SPARQL查询;我不认为您可以通过一个sparql查询来实现这一点。我想你正在使用一个支持查询过度构造数据的端点,我想dot net RDF是这样做的,但我不知道是否有其他端点支持这样做。这是一个非常简单的过度构造数据查询。不过,你可以通过查询过度构造数据来做到这一点。有关一些想法,请参阅和我的答案上的一些评论。您需要的是isSelfFreemason属性,而不是self-isIRI属性。这是一种角色化。
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>
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 .
}