Конвертировать кортежи в json, используя rdf4j

Проблема заключается в следующем: при синтаксическом анализе запроса sparql я получаю упрощенный код ast и мне нужно передать его сторонней библиотеке для дальнейшей обработки, но функциональные возможности "из коробки" (rdf4j) не позволяют передавать ast на компьютере -читаемый формат, только текс, я хотел бы получить в формате 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 ответ

Решение

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

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

Другие вопросы по тегам