Virtuoso中带SPARQL FILTER的查询无法返回SKOS推理结果相关问询
原因说明
Virtuoso的动态推理逻辑是在SPARQL查询规划阶段触发,而非预先生成全量推理三元组后再执行查询匹配:
- 直接写死谓词为
skos:broader的查询,优化器可以在规划阶段识别到该谓词对应skos:narrower的互逆推理规则,会直接将推理逻辑嵌入执行计划,所以可以拿到动态生成的三元组。 - 使用变量
?property作为谓词、后置FILTER匹配值的查询,规划阶段优化器无法提前获知?property的最终过滤值,不会触发对应的互逆推理规则,仅会匹配物理存储中实际存在的三元组,因此拿不到推理结果。
解决方案
方案1:使用VALUES绑定谓词变量(优先推荐)
在查询中用VALUES提前声明?property的取值,让优化器在规划阶段就能识别待匹配的谓词,触发对应推理规则,性能与直接写死谓词一致:
DEFINE input:inference 'skos:rules' SELECT DISTINCT ?property ?concept WHERE { VALUES ?property { skos:broader } <http://someExample/Child> ?property ?concept. }
方案2:子查询先拉全量推理结果再过滤
如果你的场景需要同时过滤多个属性、无法提前用VALUES枚举所有值,可以用子查询先拉取对应主语的所有推理三元组,再在外层执行FILTER过滤:
DEFINE input:inference 'skos:rules' SELECT DISTINCT ?property ?concept WHERE { { SELECT ?property ?concept WHERE { <http://someExample/Child> ?property ?concept. } } FILTER(?property = skos:broader) }
该方案性能略低于第一种,适合多属性过滤的复杂场景。
Virtuoso本身是支持该场景的,仅需调整查询写法适配它的推理触发规则即可。
内容的提问来源于stack exchange,提问作者anbland
相关产品推荐
相关产品推荐

