SPARQL查询筛选拥有至少三个子组织的组织名称结果不正确,请求排查问题
嘿,我帮你看看这个SPARQL查询的问题出在哪哈~首先你的需求是找出拥有至少3个子组织的组织名称,但当前的查询逻辑完全没贴合这个需求,主要有这几个关键错误:
关系属性用错了方向+类型:你用了
rdf:subClassOf,这个是用来表示类和类之间的子类关系(比如连锁总公司类 rdf:subClassOf 公司类),但子组织是具体组织实例之间的从属关系(比如上海分公司是北京总公司的下属机构),得用实例级的关联属性,比如org:subOrganizationOf(如果你的数据里用的是这个属性,没有的话就换成你数据里对应表示“子组织从属”的属性),而且要注意方向——一般子组织会指向父组织,所以是?subOrg org:subOrganizationOf ?parentOrg。过滤条件完全不成立:你写的
FILTER(?y > 3)是把一个组织资源(?y是个URI资源哦)和数字3做比较,这在SPARQL里完全是逻辑错误,根本没法统计子组织的数量,肯定出不了正确结果。缺了分组统计的核心步骤:要筛选“至少3个子组织”,核心得先把每个父组织对应的子组织都找出来,然后统计每个父组织有多少个子组织,最后只留下数量≥3的。你的查询完全没做这个统计,自然达不到目的。
给你个贴合需求的示例查询(假设数据里用org:subOrganizationOf表示子组织从属,你可以根据自己的实际数据替换属性):
SELECT ?orgName (COUNT(?subOrg) AS ?subOrgCount) WHERE { # 关联子组织到父组织 ?subOrg a foaf:Organization ; org:subOrganizationOf ?parentOrg . # 取出父组织的名称 ?parentOrg foaf:name ?orgName . } # 按父组织和它的名称分组 GROUP BY ?parentOrg ?orgName # 筛选出子组织数量≥3的 HAVING (?subOrgCount >= 3)
如果你的场景其实是要找有至少3个子类的组织类(不是实例级的子组织,而是类层级的子类),那修正后的查询应该是这样:
SELECT ?className (COUNT(?subClass) AS ?subClassCount) WHERE { ?subClass rdf:subClassOf ?parentClass ; foaf:name ?subClassName . ?parentClass a foaf:Organization ; foaf:name ?className . } GROUP BY ?parentClass ?className HAVING (?subClassCount >= 3)
这样应该就能得到你想要的结果啦~
备注:内容来源于stack exchange,提问作者Caty2014

