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

标签 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:  <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 认识的 friend 的 friend 。

所以:

  • Marty 通过 Eugene 认识了 Mike,他们都是共济会成员,所以没关系
  • 马蒂认识尤金,尤金有一个平民 friend 保罗。保罗有一个共济会 friend 艾伦。但是,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 中的解决方案。 在 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>

关于Sparql - 将限制条件应用于谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641984/

相关文章:

Sparql 1.1 获取特定类的所有实例,但不包括子类的任何实例

algorithm - 允许在一跳中完全绑定(bind)任何 6 元组模式的最小索引集是什么?

rdf - 如何将关系数据库中的数据导入RDF?

stream - C-SPARQL 查询 - 精确匹配字符串文字

validation - 如何使用 RDF 模式验证 RDF

java - 如何使用Java代码启动Fuseki服务器并使用Java代码将OWL文件上传到它?

java - Stardog 数据加载和 Jena

sparql - 从子选择中转换出来的变量的行为

java - 如何使用 Jena 编写 SPARQL 查询以在所有类的所有对象中查找文字匹配?

python - RDFLib 解析器无法识别 json-ld 格式