SPARQL查询schema.org ListItem属性返回0结果问题排查
问题分析与解决
你的查询返回0结果的核心问题是FILTER条件的类型不匹配:
schema:domainIncludes的对象是RDF资源(URI,比如schema:ListItem),而你在FILTER里把它和字符串字面量"http://schema.org/ListItem"做了比较,两者类型完全不同,自然匹配不到任何结果。
修正后的SPARQL查询
把FILTER里的字符串改成URI即可,有两种规范写法:
写法1:使用前缀引用
PREFIX schema: <http://schema.org/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?label WHERE { ?s a rdf:Property ; schema:domainIncludes ?domain ; rdfs:label ?label . FILTER(?domain = schema:ListItem) }
写法2:直接使用完整URI
PREFIX schema: <http://schema.org/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?label WHERE { ?s a rdf:Property ; schema:domainIncludes ?domain ; rdfs:label ?label . FILTER(?domain = <http://schema.org/ListItem>) }
补充说明
如果是动态生成URI字符串的场景,确实需要基于字符串对比,可以用str()函数把URI资源转换为字符串再比较,写法如下:
FILTER(str(?domain) = "http://schema.org/ListItem")
但这种写法不如直接引用URI规范,优先推荐前两种写法。
另外,你提到的TTL列表语法(逗号分隔多个对象)确实等价于多个独立的三元组,RDFlib会正确解析这种语法,所以这部分不是问题。
内容的提问来源于stack exchange,提问作者Neca
相关产品推荐
相关产品推荐

