Конвертировать кортежи в json, используя rdf4j - PullRequest
0 голосов
/ 27 января 2019

Проблема заключается в следующем: при синтаксическом анализе запроса sparql я получаю упрощенный код ast и мне нужно передать его сторонней библиотеке для дальнейшей обработки, но функциональные возможности из коробки (rdf4j) не позволяют передавать astв машиночитаемом формате, только tex, я хотел бы получить в формате json.

        StringBuilder qb = new StringBuilder();
        qb.append("    PREFIX has_vaccine_allergen: <http://purl.obolibrary.org/obo/VO_0000531>\n" +
                "    PREFIX chicken_egg_protein_allergen: <http://purl.obolibrary.org/obo/VO_0000912>   \n" +
                "    SELECT distinct ?vaccine_label ?vaccine \n" +
                "    FROM <http://purl.obolibrary.org/obo/merged/VO>\n" +
                "    WHERE {\n" +
                "        ?vaccine rdfs:label ?vaccine_label .\n" +
                "        ?vaccine rdfs:subClassOf ?vaccine_restriction .\n" +
                "        ?vaccine_restriction owl:onProperty has_vaccine_allergen:; owl:someValuesFrom chicken_egg_protein_allergen: .\n" +
                "\t}");
        SPARQLParser parser = new SPARQLParser();

        ParsedTupleQuery q = (ParsedTupleQuery)parser.parseQuery(qb.toString(), null);
        TupleExpr te = q.getTupleExpr();
        System.out.println(te);

Результат выполнения кода:

SelectQuery
[PrefixDecl (prefix=has_vaccine_allergen), PrefixDecl (prefix=chicken_egg_protein_allergen), SelectQuery]
Distinct
   Projection
      ProjectionElemList
         ProjectionElem "vaccine_label"
         ProjectionElem "vaccine"
      Join
         Join
            Join
               StatementPattern
                  Var (name=vaccine)
                  Var (name=_const_9285ccfc_uri, value=http://www.w3.org/2000/01/rdf-schema#label, anonymous)
                  Var (name=vaccine_label)
               StatementPattern
                  Var (name=vaccine)
                  Var (name=_const_4592be07_uri, value=http://www.w3.org/2000/01/rdf-schema#subClassOf, anonymous)
                  Var (name=vaccine_restriction)
            StatementPattern
               Var (name=vaccine_restriction)
               Var (name=_const_a509c4e0_uri, value=http://www.w3.org/2002/07/owl#onProperty, anonymous)
               Var (name=_const_3319983d_uri, value=http://purl.obolibrary.org/obo/VO_0000531, anonymous)
         StatementPattern
            Var (name=vaccine_restriction)
            Var (name=_const_6539d60c_uri, value=http://www.w3.org/2002/07/owl#someValuesFrom, anonymous)
            Var (name=_const_3319a704_uri, value=http://purl.obolibrary.org/obo/VO_0000912, anonymous)

Мне нужно получить его в формате json

1 Ответ

0 голосов
/ 28 января 2019

Прежде всего: объект TupleExpr (и дерево под ним) не является абстрактным синтаксическим деревом (AST), а вместо этого является моделью алгебры запросов RDF4J.Если вы хотите работать непосредственно с AST запроса SPARQL, вы можете использовать SyntaxTreeBuilder.parseQuery(queryString) для получения фактического AST.Тем не менее, выполнение повторной обработки запросов в модели AST или алгебры может работать, это зависит от того, что именно должен делать ваш вывод, какой из них является лучшим выбором.

Для модели AST или алгебры запросов RDF4J имеет абстрактные реализации Visitor , которые вы можете свободно расширять для своих собственных нужд.Для деревьев AST AbstractASTVisitor является хорошей отправной точкой (убедитесь, что вы выбрали правильный вариант, RDF4J имеет два: один для SeRQL, один для SPARQL).Для моделей алгебры запросов нужно начинать с AbstractQueryModelVisitor.В самой базе кода RDF4J есть множество примеров реализации любого из них.Типичный шаблон заключается в том, что вы переопределяете методы meet, где вы хотите определить свое собственное поведение, заботясь о том, чтобы в конце вызывать super.meet() при обработке узла, который не является листом.

...