【问题标题】:SPARQL query in Apache JenaApache Jena 中的 SPARQL 查询
【发布时间】:2018-09-21 19:58:55
【问题描述】:

我想写一个类似这样的查询——

select ?s ?p ?o where {?s ?p ?o. ?s rdf:subClassOf + mySpecificSubjectValue +}

有没有现有的方法可以做到这一点?或者我是否必须通过检查所有主题来手动完成。而且我不想在查询中使用正则表达式,因为正则表达式会产生一些问题,例如:base:hotel 和 base:hotelName

【问题讨论】:

  • “有没有现成的方法可以做到这一点?” -> 请问你现在要的是什么?你读过文档吗?我的意思是,它只是发送查询字符串,不是吗?您没有显示任何代码或示例数据。我希望你知道mySpecificSubjectValue 必须是一个类?
  • “或者我必须手动检查所有科目。” - 这个问题是什么意思?
  • “而且我不想在查询中使用正则表达式,因为正则表达式会产生一些问题,例如:base:hotel 和 base:hotelName” - 我没有看到您查询中的任何正则表达式,同样不清楚您在做什么
  • 对了,它叫rdfs:subClassOf...
  • 我要表达的是:例如,我有这个数据集base.org/hotelrdfs:type base:hotel base.org/hotelrdfs:label "something" base.org/hotelArea rdfs:type base:hotelArea @ 987654324@ rdfs:label "something" 我想提取酒店的所有三元组,而不是hotelArea。我不想使用正则表达式。我知道用正则表达式查询的方式。我在问是否有办法在查询中传递变量。

标签: java sparql jena


【解决方案1】:

Jena 有一组用于构建查询实例的类。 这是一个构建像您这样的查询的示例:

String yourclassuri =  "base:hotel" ;
    //Intialize the select statatment
    Query select = new Query();

    //set prefixes
    select.setPrefix("rdf","rdfurl");
    select.setPrefix("base","yourbaseurl");

    select.setQuerySelectType();
    select.addResultVar("s");
    select.addResultVar("p");
    select.addResultVar("o");

    final ElementPathBlock elementPathBlock = new ElementPathBlock();

    //create the first pattern in the where
    final Node s = NodeFactory.createVariable("s");
    final Node p = NodeFactory.createVariable("p");
    final Node o = NodeFactory.createVariable("o");
    elementPathBlock.addTriple(new Triple(s,p,o));

    //create the last pattern
    final Node subclass = NodeFactory.createURI("rdf:subClassOf");
    final Node rdfclass = NodeFactory.createURI(yourclassuri);
    elementPathBlock.addTriple(new Triple(s,subclass,rdfclass));

    select.setQueryPattern(elementPathBlock);

    //serialize the query in a string
    String query = select.serialize();

    //output select ?s ?p ?o where {?s ?p ?o. ?s rdf:subClassOf base:hotel}

来源:Jena javadoc

请注意,您可以使用ParametrizedSparqlString,但当您想要注入前缀名称(如 base:name)时,它似乎无效。 Javadoc 还警告可能的 SPARQL 注入问题:

SPARQL 注入说明

虽然这个类在一定程度上是为了防止 SPARQL 注入而设计的,但它绝不是万无一失的,因为它纯粹在文本级别上工作。当前版本的代码解决了开发人员已经确定的一些可能的攻击向量,但我们并没有声称自己足够狡猾,可以考虑并阻止所有可能的攻击向量。

我怀疑查询构建对这种攻击更安全一些。 另外here 是关于 ParameterizedSparqlString 限制的另一个问题。

【讨论】:

  • 好吧,我不认为这是她所要求的(除了这个问题对我来说不是很清楚)。从我的角度来看,仅使用 Java 字符串要简单得多。如果需要模板查询之类的东西,ParameterizedSparqlString 是不错的选择。
  • 根据她最后的评论,我正在考虑一个参数化查询......无论如何我不知道 ParameterizedSparqlString。我同意在这种情况下它更适合,然后构建整个查询。我会用你的建议更新答案!谢谢。
  • 我发现没有任何方法可以使用 ParametrizeSparqlString 在查询模板中有效地注入前缀名称。 setIri("var","name:value") 方法注入 <name:value> 这不是一个有效的 SPARQL GraphNode。另请参阅此答案stackoverflow.com/a/43020661/925955 了解更多详情。
  • String sparql = "SELECT DISTINCT ?s WHERE { ?s rdfs:subClassOf ?object.}"; ParameterizedSparqlString queryStr = new ParameterizedSparqlString(sparql);字符串值 = "something.org/ontology#Feature"; queryStr.setIri("对象", 值);它显示了所有具有属性 rdfs:subClassOf 的类。我做错了什么?
  • 你检查过参数是否真的被替换了吗?除此之外我没有任何线索,对不起。您是否尝试过查询构建器方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多