Как преобразовать выражение класса (из ограничения unionOf) в строку? - PullRequest
0 голосов
/ 25 июня 2019

Запрос SPARQL возвращает результат с ограничениями allValuesFrom и unionOf.Мне нужно сделать concat эти значения, но когда я использую функции bind или str, результат будет пустым.

Я пробовал функции 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'))
}

Результат запроса SPARQL в Protegé:

Result of SPARQL query in Protegé

1 Ответ

1 голос
/ 26 июня 2019

В Jena вряд ли можно получить такие строки, как 'xxx или yyy', поскольку это Manchester Syntax, собственный формат OWL-API, и он не поддерживается Jena.Любое выражение класса на самом деле является b-узлом, таких встроенных символов, как 'или', в необработанном RDF нет.

Чтобы представить любое выражение анонимного класса в виде строки, вы можете использовать ONT-API , который является основанным на jena OWL-API, и, следовательно, там поддерживаются и SPARQL, и Манчестерский синтаксис.

Вот пример, основанный на онтологии пиццы:

// use pizza, since no example data provided in the question:
IRI pizza = IRI.create("https://raw.githubusercontent.com/avicomp/ont-api/master/src/test/resources/ontapi/pizza.ttl");
// get OWLOntologyManager instance from ONT-API
OntologyManager manager = OntManagers.createONT();
// as extended Jena model:
OntGraphModel 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 NoCacheObjectFactory(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.get(vars.get(1).inModel(model).as(OntCE.class)).getObject();
        // 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

Используемые env: ont-api: 1.4.1, owl-api: 5.1.11, jena-arq: 3.12.0

...