我是 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/