我正在玩Sesame的queryparser-sparql lib,但我似乎无法从解析的查询中获取OPTIONAL
语句。
鉴于查询:
PREFIX ex: <http://example.com/#>
SELECT * WHERE {
?s a ex:Foo .
OPTIONAL { ?s ex:someProperty ?property }
} LIMIT 10
使用以下代码解析它(使用Sesame 2.7.2):
SPARQLParserFactory factory = new SPARQLParserFactory();
QueryParser parser = factory.getParser();
ParsedQuery parsedQuery = parser.parseQuery(sparqlQuery, null);
StatementPatternCollector collector = new StatementPatternCollector();
TupleExpr tupleExpr = parsedQuery.getTupleExpr();
tupleExpr.visit(collector);
for (StatementPattern pattern : collector.getStatementPatterns()) {
System.out.println(pattern);
}
打印parsedQuery
给出:
Slice ( limit=10 )
Projection
ProjectionElemList
ProjectionElem "s"
ProjectionElem "property"
LeftJoin
StatementPattern
Var (name=s)
Var (name=-const-1, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)
Var (name=-const-2, value=http://example.com/#Foo, anonymous)
StatementPattern
Var (name=s)
Var (name=-const-3, value=http://example.com/#someProperty, anonymous)
Var (name=property)
打印每个pattern
给出:
StatementPattern
Var (name=s)
Var (name=-const-1, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)
Var (name=-const-2, value=http://example.com/#Foo, anonymous)
StatementPattern
Var (name=s)
Var (name=-const-3, value=http://example.com/#someProperty, anonymous)
Var (name=property)
如何从StatementPattern
获取有关OPTIONAL
的信息?
答案 0 :(得分:1)
解决问题的唯一方法是检查它是否作为LeftJoin
的右手参数的一部分出现。一个相对简单的方法就是实现一个QueryModelVisitor
,它在遇到左连接并下降其右侧参数时设置某种标志。
或者,您可以从StatementPattern
通过getParent
在查询模型中进行备份传播,然后像这样检查树 - 这可能会更难,但LeftJoin
可能不一定成为SP的直接父母。