如何用通用规则引擎内置函数listContains替换SPARQL中的VALUES取值
Jena
listContains 内置函数使用说明 首先明确:listContains 是Jena推理引擎规则体系的专属内置函数,仅可用于自定义推理规则中,作用是校验指定值是否存在于给定的RDF列表中。
基础使用方式
你可以直接在规则中硬编码待校验的值列表,实现三元组对象匹配逻辑。比如你要校验?a delph:hasLemma ?l的?l是否属于["no", "neg"]列表,规则写法如下:
[checkNegativeLemma: # 匹配目标三元组 (?a delph:hasLemma ?l) # 校验?l是否在指定列表中,第一个参数为值列表,第二个为待校验变量 listContains(("no" "neg"), ?l) -> # 匹配成功后执行的逻辑,示例为给?a添加否定标签 (?a delph:isNegativeLemma "true"^^xsd:boolean) ]
动态传入值列表
如果不想把列表硬编码在规则中,你可以先将值列表存储到RDF图中,再在规则中绑定列表变量使用:
- 先在RDF数据中定义列表:
delph:config delph:negativeLemmas ("no" "neg" "none") .
- 对应规则写法:
[checkNegativeLemma: delph:config delph:negativeLemmas ?lemmaList (?a delph:hasLemma ?l) listContains(?lemmaList, ?l) -> (?a delph:isNegativeLemma "true"^^xsd:boolean) ]
替代方案(标准SPARQL通用)
如果你只是在做SPARQL查询,不需要用到推理规则,不需要调用listContains,有两种更通用的实现方式:
- 用VALUES子句(就是你示例中给出的写法):
SELECT ?a WHERE { VALUES ?l {"no" "neg"} ?a delph:hasLemma ?l. }
- 用FILTER+IN函数:
SELECT ?a WHERE { ?a delph:hasLemma ?l. FILTER(?l IN ("no", "neg")) }
内容的提问来源于stack exchange,提问作者Alexandre Rademaker
相关产品推荐
相关产品推荐

