我在三重商店中有数据,并想计算以下内容:
有多少资源' x'拥有对象属性' op'至少有2种不同的资源' r'相似类型' R'作为价值观?
以下是龟语法中此类数据的示例:
PREFIX ex: <http://example.com>
ex:doc1
a ex:Document ;
ex:mentions p1, p2, p3 .
ex:doc2
a ex:Document ;
ex:mentions p4, p5 .
ex:p1
a ex:Person ;
ex:hasRole ex:r1 .
ex:p2
a ex:Person ;
ex:hasRole ex:r1 .
ex:p3
a ex:Person ;
ex:hasRole ex:r2 .
ex:p4
a ex:Person ;
ex:hasRole ex:r1 .
ex:p5
a ex:Person ;
ex:hasRole ex:r2 .
ex:r1
a ex:Role1 .
ex:r2
a ex:Role2 .
目标是计算ex:doc1
等资源,其中2 ex:mentions
具有相似的角色(r1
类型ex:Role1
)。这里的结果将是1,除了ex:doc2`。
策略是:
识别具有所需属性的资源,即具有指向资源(人)的对象属性(提及)的文档(doc),这些资源本身具有相似值的属性(hasRole)(角色))。
算上他们。
我在第1步遇到困难。 例如,此查询将返回具有带有Role1的p1的所有文档,即使只有一个p(p1)具有此属性。
SELECT distinct ?doc
WHERE
{
?doc a ex:Document .
?doc ex:mentions ?p1 .
?doc ex:mentions ?p2 .
?p1 ex:hasRole ?r1 .
?p2 ex:hasRole ?r1 .
?r1 a ex:Role1 .
}
非常感谢你的帮助。
答案 0 :(得分:0)
您的数据不太可用(p1,p2等资源上没有前缀),但在修复之后,我能够使用以下查询。你很亲密;诀窍是你需要过滤(?p1!=?p2)以确保你获得ex:mentions属性的不同值。然后你可以检查他们是否有一个具有?p1 ex:hasRole / a?roleType的公共类型的角色。 ?p2 ex:hasRole / a?roleType ,或者更简洁,?roleType ^(a / ex:hasRole)?p1,?p2 。然后,在计数中,您只想计算?document 的不同值,因此您需要(count(distinct?document)为?nDocuments)强>:
prefix ex: <http://example.com>
select
#-- count ?document, but only count *distinct* values
#-- of ?document.
(count(distinct ?document) as ?nDocuments)
where {
#-- get documents that have two distinct
#-- values for the ex:mentions property
?document a ex:Document ; ex:mentions ?p1, ?p2
filter(?p1 != ?p2)
#-- then check that they have a common role type
?roleType ^(a/ex:hasRole) ?p1, ?p2
}
--------------
| nDocuments |
==============
| 2 |
--------------