Jena Riot推理出含字面量主语的无效RDF,SHACL验证崩溃求助
问题
我使用Jena riot CLI工具执行RDFS推理后,将生成的RDF文件输入到SHACL CLI工具进行验证时出现崩溃。
我的模式定义(tbox.ttl):
lob:account_number rdfs:domain lob:Account; rdfs:range xsd:string .
数据内容(abox.ttl):
:cbaEverydayOffset a :BankAccount; rdfs:label "Everyday Offset Account"; :bsb "063-791"^^xsd:string; :account_number "1234567".
执行的推理命令:
riot --rdfs=tbox.ttl --strict --formatted=ttl abox.ttl > inferred.ttl
生成的inferred.ttl中包含了不符合标准RDF规范的语句:
"1234567" rdf:type xsd:string .
字面量作为主语违反了RDF的基础规则,导致SHACL验证工具崩溃。请问这是否与RDF*兼容性有关?该如何解决?
解决方案
- 这不是RDF*相关的问题,是Jena默认RDFS推理的行为所致。Jena默认的RDFS推理会为属性值域声明生成额外的类型断言,即使主语是字面量——但标准RDF不允许字面量作为主语,因此产生了无效语句。
- 有两种可行的解决方式:
- 使用安全推理模式:将命令中的
--rdfs替换为--rdfs-safe参数,该模式会生成符合标准RDF规范的推理结果,不会产生字面量作为主语的语句。修改后的命令:riot --rdfs-safe=tbox.ttl --strict --formatted=ttl abox.ttl > inferred.ttl - 过滤无效语句:如果必须使用默认RDFS推理,可在生成
inferred.ttl后,过滤掉字面量为主语的语句。- 用
grep快速过滤(适合简单场景):grep -v '^"[^"]*" ' inferred.ttl > filtered_inferred.ttl - 用Jena的
arq工具精确筛选合法三元组:arq --data inferred.ttl --query "SELECT ?s ?p ?o WHERE { ?s ?p ?o . FILTER(isIRI(?s)) }" --results ttl > filtered_inferred.ttl
- 用
- 使用安全推理模式:将命令中的
内容的提问来源于stack exchange,提问作者Andrew Matthews
相关产品推荐
相关产品推荐

