Rdf 统计SPARQL中具有特定类型属性的资源
我有三重存储中的数据,并希望计算以下内容: 有多少资源“x”具有对象属性“op”,其中至少有2个类似类型“r”的不同资源“r”作为值 以下是海龟语法中此类数据的示例: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 ;
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 .
}