为了账号安全,请及时绑定邮箱和手机立即绑定

使用 rdf4j 将元组转换为 json

使用 rdf4j 将元组转换为 json

HUH函数 2022-05-25 09:51:39
问题如下:在解析 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)我需要把它变成 json 格式
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

首先:TupleExpr对象(及其下面的树)不是抽象语法树(AST),而是 RDF4J 的查询代数模型。如果您希望直接处理 SPARQL 查询的 AST,您可以使用它SyntaxTreeBuilder.parseQuery(queryString)来接收实际的 AST。也就是说,在 AST 或代数模型上进行查询重新处理都可以工作,这在一定程度上取决于您的输出到底应该做什么,哪个是最佳选择。

对于 AST 或查询代数模型,RDF4J 具有抽象的访问者实现,您可以根据自己的需要自由扩展。对于 AST 树,AbstractASTVisitor是一个很好的起点(确保选择正确的树,RDF4J 有两个:一个用于 SeRQL,一个用于 SPARQL)。对于查询代数模型,开始的地方是AbstractQueryModelVisitor. 在 RDF4J 代码库本身中有大量的实现示例。典型的模式是您覆盖meet要定义自己行为的方法,super.meet()并在处理不是叶子的节点时注意在最后调用。


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 85 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信