[英]Convert tuples to json using rdf4j
问题如下:解析 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 格式
首先: TupleExpr
对象(以及它下面的树)不是抽象语法树(AST),而是 RDF4J 的查询代数模型。 如果您希望直接处理 SPARQL 查询的 AST,您可以使用SyntaxTreeBuilder.parseQuery(queryString)
来接收实际的 AST。 也就是说,在 AST 或代数模型上进行查询重新处理都可以工作,这在一定程度上取决于您的输出究竟应该做什么,哪个是最佳选择。
对于 AST 或查询代数模型,RDF4J 具有抽象的访问者实现,您可以根据自己的需要自由扩展这些实现。 对于 AST 树, AbstractASTVisitor
是一个很好的起点(确保选择正确的一个,RDF4J 有两个:一个用于 SeRQL,一个用于 SPARQL)。 对于查询代数模型,起点是AbstractQueryModelVisitor
。 在 RDF4J 代码库本身中有大量的实现示例。 典型的模式是您在要定义自己的行为的地方覆盖meet
方法,当您处理不是叶子的节点时,请super.meet()
在最后调用super.meet()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.