【发布时间】:2023-04-05 19:18:01
【问题描述】:
我想做一个执行以下操作的查询:如果存在从s 到o 的长度至少为 2 条边且属性为p 的路径,则选择所有三元组(s,p,o)。所以路径的所有边缘都必须标有p。
我尝试了以下方法:
select ?s <http://dbpedia.org/ontology/isPartOf> ?o
WHERE {
?s <http://dbpedia.org/ontology/isPartOf>{2,} ?o.
?s <http://dbpedia.org/ontology/isPartOf> ?o
}
我使用 Jena API 执行了它:
ParameterizedSparqlString parameterizedSparql = new ParameterizedSparqlString(model);
parameterizedSparql.setCommandText(sparql);
Query query = QueryFactory.create(parameterizedSparql.asQuery().toString(), Syntax.syntaxARQ);
QueryExecutionFactory.create(query, model).execSelect();
我使用了Syntax.syntaxARQ,以便它能够理解属性路径。
它给了我以下错误:
Exception in thread "main" org.apache.jena.query.QueryParseException: Encountered " "{" "{ "" at line 3, column 42.
Was expecting one of:
<IRIref> ...
<PNAME_NS> ...
<PNAME_LN> ...
<BLANK_NODE_LABEL> ...
<VAR1> ...
<VAR2> ...
你能告诉我如何正确地进行查询吗?
【问题讨论】:
-
您不能使用
{2,}- 此功能从未出现在final property path syntax 中,只是在working draft 中进行了讨论。除此之外的任何东西都是特定于实现的,因此,取决于三元存储。 -
显而易见的解决方法是使用序列
<http://dbpedia.org/ontology/isPartOf>/<http://dbpedia.org/ontology/isPartOf>+,它与“2 or more”相同 -
建议:打印出来并检查
parameterizedSparql.asQuery().toString()的语法。 -
SELECT ?s <http://dbpedia.org/ontology/isPartOf> ?o并没有像您认为的那样做。相反,尝试SELECT ?s ( <http://dbpedia.org/ontology/isPartOf> AS ?p ) ?o... 并考虑使用{1,}的单线图形模式,而不是上面的两线模式。 -
ParameterizedSparqlString.asQuery()不是必需的。只需使用parameterizedSparql.toString()。ParameterizedSparqlString.asQuery不适用于扩展语法查询。
标签: sparql jena propertypath