SPARQL-запрос в Apache Jena - PullRequest
       6

SPARQL-запрос в Apache Jena

0 голосов
/ 21 сентября 2018

Я хочу написать запрос, подобный этому -

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

Есть ли какой-нибудь способ сделать это?Или я должен сделать это вручную, проверив все предметы.А также я не хочу использовать регулярные выражения в запросе, потому что регулярные выражения создают некоторые проблемы, например: base: hotel и base: hotelName

1 Ответ

0 голосов
/ 22 сентября 2018

В 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, он ни в коем случае не защищен от ошибок, поскольку работает исключительно натекстовый уровень.Текущая версия кода обращается к некоторым возможным векторам атак, которые разработчики определили, но мы не утверждаем, что были достаточно хитрыми, чтобы продумать и предотвратить каждый возможный вектор атаки.

Я подозреваю, что построение запросовнемного безопаснее от такого рода атак.Также здесь это другой вопрос о пределах ParameterizedSparqlString.

...