Rdf 统计SPARQL中具有特定类型属性的资源

Rdf 统计SPARQL中具有特定类型属性的资源,rdf,sparql,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 ;

我有三重存储中的数据,并希望计算以下内容:

有多少资源“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 .

非常感谢您的帮助。

您的数据不是很有用(p1、p2等参考资料中没有前缀),但在解决了这个问题后,我能够使用以下查询。你很接近;诀窍是,您需要过滤(?p1!=?p2)以确保获得不同的ex:interences属性值。然后,您可以检查他们是否有一个角色,该角色的公共类型为?p1 ex:hasRole/a?roleType?p2 ex:hasRole/a角色类型,或者更简洁地说,角色类型^(a/ex:hasRole)?p1,?p2。然后,在计算中,您只想计算文档的不同值,因此您需要(将(不同的文档)计算为内部文档)

前缀ex:
选择
#--计数?文档,但仅计数*不同*值
#--关于?文件。
(将(不同的文件)计为文件)
在哪里{
#--获取具有两个不同属性的文档
#--ex:References属性的值
?文件a ex:文件;ex:提及p1、p2
过滤器(?p1!=?p2)
#--然后检查他们是否有共同的角色类型
角色类型^(a/ex:hasRole)?p1,?p2
}
--------------
|文件|
==============
| 2          |
--------------

您的数据不是很有用(p1、p2等资源上没有前缀),但在修复了这个问题后,我可以使用以下查询。你很接近;诀窍是,您需要过滤(?p1!=?p2)以确保获得不同的ex:interences属性值。然后,您可以检查他们是否有一个角色,该角色的公共类型为?p1 ex:hasRole/a?roleType?p2 ex:hasRole/a角色类型,或者更简洁地说,角色类型^(a/ex:hasRole)?p1,?p2。然后,在计算中,您只想计算文档的不同值,因此您需要(将(不同的文档)计算为内部文档)

前缀ex:
选择
#--计数?文档,但仅计数*不同*值
#--关于?文件。
(将(不同的文件)计为文件)
在哪里{
#--获取具有两个不同属性的文档
#--ex:References属性的值
?文件a ex:文件;ex:提及p1、p2
过滤器(?p1!=?p2)
#--然后检查他们是否有共同的角色类型
角色类型^(a/ex:hasRole)?p1,?p2
}
--------------
|文件|
==============
| 2          |
--------------

非常感谢,它很有效!对不起,数据不完整。我错过了过滤器,通过您的示例,我学会了如何更简洁地编写SPARQL内容。我太早按enter键了。另外一个问题是:除了练习之外,你会推荐这本书吗:Bob DuCharme的《学习SPARQL》?()谢谢你,祝你度过愉快的一天。@chris谢谢你建议的编辑。它被拒绝了,可能是因为这些技术细节通常在评论中得到更好的处理。虽然我的代码中有一个bug,但我认为你的编辑中也有。我认为(但我不确定),OP并不一定关心不同的人有共同的特定角色,而是他们每个人都有相同类型的角色。例如,p1具有角色r1a。r1a角色1,p2角色r1b。r1b角色1仍然有效。因此,我更新了我的答案。非常感谢,它很有效!对不起,数据不完整。我错过了过滤器,通过您的示例,我学会了如何更简洁地编写SPARQL内容。我太早按enter键了。另外一个问题是:除了练习之外,你会推荐这本书吗:Bob DuCharme的《学习SPARQL》?()谢谢你,祝你度过愉快的一天。@chris谢谢你建议的编辑。它被拒绝了,可能是因为这些技术细节通常在评论中得到更好的处理。虽然我的代码中有一个bug,但我认为你的编辑中也有。我认为(但我不确定),OP并不一定关心不同的人有共同的特定角色,而是他们每个人都有相同类型的角色。例如,p1具有角色r1a。r1a角色1,p2角色r1b。r1b角色1仍然有效。因此,我更新了我的答案。非常感谢,它很有效!对不起,数据不完整。我错过了过滤器,通过您的示例,我学会了如何更简洁地编写SPARQL内容。我太早按enter键了。另外一个问题是:除了练习之外,你会推荐这本书吗:Bob DuCharme的《学习SPARQL》?()谢谢你,祝你度过愉快的一天。@chris谢谢你建议的编辑。它被拒绝了,可能是因为这些技术细节通常在评论中得到更好的处理。虽然我的代码中有一个bug,但我认为你的编辑中也有。我认为(但我不确定),OP并不一定关心不同的人有共同的特定角色,而是他们每个人都有相同类型的角色。例如,p1具有角色r1a。r1a角色1,p2角色r1b。r1b角色1仍然有效。因此,我更新了我的答案。
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 .
}