sparql - 如何将类表达式(从限制 unionOf)转换为字符串?
问题描述
SPARQL 查询返回带有 和 限制的allValuesFrom
结果unionOf
。我需要做concat
这些值,但是,当我使用bind
orstr
函数时,结果是空白的。
我尝试了bind
,str
和group_concat
功能,但是,所有这些都不成功。Group_concat
返回一个空白节点。
SELECT DISTINCT ?source ?is_succeeded_by
WHERE {
?source rdfs:subClassOf ?restriction .
?restriction owl:onProperty j.0:isSucceededBy .
?restriction owl:allValuesFrom ?is_succeeded_by .
FILTER (REGEX(STR(?source), 'gatw-Invoice_match'))
}
Protegé 中 SPARQL 查询的结果:
解决方案
您很难在 Jena 中以编程方式获取像 'xxx 或 yyy' 这样的字符串,因为它是曼彻斯特语法,一种 OWL-API 原生格式,并且不受 Jena 支持。任何类表达式实际上都是 b 节点,在原始 RDF 中没有像“或”这样的内置符号。
要将任何匿名类表达式表示为字符串,您可以使用ONT-API,它是一个基于 jena 的 OWL-API,因此,那里支持 SPARQL 和 Manchester 语法。
下面是一个基于披萨本体的例子:
// use pizza, since no example data provided in the question:
IRI pizza = IRI.create("https://raw.githubusercontent.com/owlcs/ont-api/master/src/test/resources/ontapi/pizza.ttl");
// get OWLOntologyManager instance from ONT-API
OntologyManager manager = OntManagers.createONT();
// as extended Jena model:
OntModel model = manager.loadOntology(pizza).asGraphModel();
// prepare query that looks like the original, but for pizza
String txt = "SELECT DISTINCT ?source ?is_succeeded_by\n" +
"WHERE {\n" +
" ?source rdfs:subClassOf ?restriction . \n" +
" ?restriction owl:onProperty :hasTopping . \n" +
" ?restriction owl:allValuesFrom ?is_succeeded_by .\n" +
" FILTER (REGEX(STR(?source), 'Am'))\n" +
"}";
Query q = new Query();
q.setPrefixMapping(model);
q = QueryFactory.parse(q, txt, null, Syntax.defaultQuerySyntax);
// from owlapi-parsers package:
OWLObjectRenderer renderer = new ManchesterOWLSyntaxOWLObjectRendererImpl();
// from ont-api (although it is a part of internal API, it is public):
InternalObjectFactory iof = new SimpleObjectFactory(manager.getOWLDataFactory());
// exec SPARQL query:
try (QueryExecution exec = QueryExecutionFactory.create(q, model)) {
ResultSet res = exec.execSelect();
while (res.hasNext()) {
QuerySolution qs = res.next();
List<Resource> vars = Iter.asStream(qs.varNames()).map(qs::getResource).collect(Collectors.toList());
if (vars.size() != 2)
throw new IllegalStateException("For the specified query and valid OWL must not happen");
// Resource (Jena) -> OntCE (ONT-API) -> ONTObject (ONT-API) -> OWLClassExpression (OWL-API)
OWLClassExpression ex = iof.getClass(vars.get(1).inModel(model).as(OntClass.class)).getOWLObject();
// format: 'class local name' ||| 'superclass string in ManSyn'
System.out.println(vars.get(0).getLocalName() + " ||| " + renderer.render(ex));
}
}
输出:
American ||| MozzarellaTopping or PeperoniSausageTopping or TomatoTopping
AmericanHot ||| HotGreenPepperTopping or JalapenoPepperTopping or MozzarellaTopping or PeperoniSausageTopping or TomatoTopping
使用的环境:ont-api:2.0.0、owl-api:5.1.11、jena-arq:3.13.1
推荐阅读
- c++ - QML 信号处理程序不响应 C++ 信号
- python - 运行时错误导致意外值
- left-join - 执行连接时雪花无效标识符
- java - 存储和打印存储在抽象类的子类的对象数组中的值
- javascript - Javascript:将考试成绩转换为字母成绩的按钮
- regex - 如何优化正则表达式匹配,得到两条不同的路径
- c - 我的字符串传递给 C 中的指针函数时出错?
- javascript - 当我将 ccomponentDidUpdate 与 axios 一起使用时,我无法停止反应 js 中的循环
- xml - Creating a generic XSLT document to transform any non-root Element with child elements
- wordpress - Gridsome + Wordpress 源插件 - 如何按月和年添加存档路线