在SPARQL中计算具有特定类型属性的资源

时间:2015-06-15 11:11:42

标签: rdf sparql

我在三重商店中有数据,并想计算以下内容:

有多少资源' 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`。

策略是:

  1. 识别具有所需属性的资源,即具有指向资源(人)的对象属性(提及)的文档(doc),这些资源本身具有相似值的属性(hasRole)(角色))。

  2. 算上他们。

  3. 我在第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 .
    }
    

    非常感谢你的帮助。

1 个答案:

答案 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          |
--------------