如何用SPARQL的VALUES子句为每种类型各取一个实例并查询其属性
问题描述
我的知识图谱(KG)中有多种类型的实体实例,想要用VALUES子句指定所有目标类型,为每种类型各选取一个样本实例,再查询该实例的全部属性。尝试了以下SPARQL语句:
select * where { select ?s where { ?typ VALUES ( ex:t1 ex:t2 ex:t3 ) . ?s a ?typ . # get one ?s of type ex:t1, ex:t2, ex:t3 } limit 1 ?s ?p ?o . }
但这个语句只返回一个实例就终止了,把VALUES放在子查询外也解决不了问题,该怎么实现需求?
解决方案
你原来的查询里,子查询加了limit 1,相当于从所有符合条件的实例里随便挑一个就停了,当然只能拿到一条结果。要实现每种类型各拿一个样本,得按类型分组,给每个组单独选一个实例,再查它的属性。
直接用这个查询就行:
SELECT ?s ?p ?o WHERE { # 先给每个目标类型挑一个样本实例 { SELECT ?typ (SAMPLE(?s) AS ?sample) WHERE { VALUES ?typ { ex:t1 ex:t2 ex:t3 } ?s a ?typ . } GROUP BY ?typ } # 再查这个样本的所有属性 ?sample ?p ?o . }
简单说下逻辑:
- 子查询里用
VALUES列出你要的类型,然后按?typ分组,SAMPLE(?s)会从每个类型的实例里随机选一个(不同查询引擎的采样规则可能有差别,但能保证每个类型至少返回一个实例) - 外层查询把选出来的样本实例,关联它的所有属性三元组,就能得到每个样本的全部属性了
要是你不想随机选,想固定拿URI排序后的第一个/最后一个,把SAMPLE(?s)换成MIN(?s)或者MAX(?s)就行,比如:
SELECT ?typ (MIN(?s) AS ?sample) WHERE { VALUES ?typ { ex:t1 ex:t2 ex:t3 } ?s a ?typ . } GROUP BY ?typ
内容的提问来源于stack exchange,提问作者rottyguy
相关产品推荐
相关产品推荐

