Как построить запросы SPARQL в java?

есть ли библиотека, которая может создавать запросы SPARQL программно, как CriteriaBuilder в JPA или построить запросы, как с PreparedStatement для SQL?

похожие (для SQL): самый чистый способ построить строку SQL в Java

8 ответов


вы можете программно создавать запросы в Jena, используя два метода: синтаксис или алгебру. Есть введение в Jena wiki.

используя алгебру, вы бы сделали что-то вроде:

Op op;
BasicPattern pat = new BasicPattern();                 // Make a pattern
pat.add(pattern);                                      // Add our pattern match
op = new OpBGP(pat);                                   // Make a BGP from this pattern
op = OpFilter.filter(e, op);                           // Filter that pattern with our expression
op = new OpProject(op, Arrays.asList(Var.alloc("s"))); // Reduce to just ?s
Query q = OpAsQuery.asQuery(op);                       // Convert to a query
q.setQuerySelectType();                                // Make is a select query

(взято со страницы wiki)

это не CriteriaBuilder (и не должно было быть), но это часть пути туда. Вы OpJoin а и OpUnion когда вы хотите или, и т. д. Болевые точки-это выражения в моем опыте: вы, вероятно, хотите разберите их из строки.


последние версии Jena добавили StringBuilder style API для построения строк запросов / обновлений и их параметризации при желании.

этот класс называется ParameterizedSparqlString, вот пример использования его для создания запроса:

ParameterizedSparqlString queryStr = new ParameterizedSparqlString();
queryStr.setNSPrefix("sw", "http://skunkworks.example.com/redacted#");
queryStr.append("SELECT ?a ?b ?c ?d");
queryStr.append("{");
queryStr.append("   ?rawHit sw:key");
queryStr.appendNode(someKey);
queryStr.append(".");
queryStr.append("  ?rawHit sw:a ?a .");
queryStr.append("  ?rawHit sw:b ?b .");
queryStr.append("  ?rawHit sw:c ?c . ");
queryStr.append("  ?rawHit sw:d ?d .");
queryStr.append("} ORDER BY DESC(d)");

Query q = queryStr.asQuery();

отказ от ответственности - Я разработчик, который внес эту функциональность в Jena

посмотреть каков наилучший способ параметизации запросов SPARQL? более подробно об этом через различные API.


я реализовал SPARQL Java - своего рода DSL для написания запросов SPARQL на Java.

он решает проблему с автоматическим форматированием IDE связанных строк запросов SPARQL и тому подобное.

например:

String shortQuery = Q.prefix("books", "http://example.org/books#")
            .select("?book ?authorName", new where() {
                {
                    $("?book books:author ?author");
                    $("?author books:authorName ?authorName");
                }
            }).get();

Я недавно начал использовать Сезам query builder. Он выглядит многообещающим, за исключением того, что он не предоставляет много документации, и я изо всех сил пытался найти примеры. Вот простой пример, который может помочь вам начать работу:

ParsedTupleQuery query = QueryBuilderFactory
            .select("pubProperty", "pubPropertyValue")
                .group()
                    .atom(cmResource(resourceId), LinkPublicationsTransformation.REFERENCE_URI, "pubUri")
                    .atom("pubUri", "pubProperty", "pubPropertyValue")
                    .filter(isLiteral("pubPropertyValue"))
                .closeGroup()
            .query();

просто обратите внимание, что isLiteral и cmResource мой собственный маленький статичных классов. isLiteral расшифровывается как new IsLiteral(new Var("...")) например, где последний создает URI с моим сильно используемым префиксом.

вы можете быть также заинтересованы в SPARQLQueryRenderer, который может превратить ParsedQuery на String что может быть удобно для дальнейшего использования.

если вы используете String(Builder) подходите к тому, что я отговариваю вас делать, по крайней мере, посмотрите на RenderUtils С sesame-queryrendered который имеет все удобные методы для добавления < > вокруг Урис, побег специальные символы и т. д.


на Сезам framework предлагает API репозитория, который несколько похож на JDBC - он позволяет создавать подготовленный объект запроса и вводить привязки переменных перед его выполнением:

String query = "SELECT * WHERE {?X ?P ?Y }";
TupleQuery preparedQuery = conn.prepareQuery(QuerLanguage.SPARQL, query);
preparedQuery.setBinding("X", someValue);
...
TupleQueryResult result = preparedQuery.evaluate();

Jena предоставляет QueryBuilder в дополнительном пакете.

https://jena.apache.org/documentation/extras/querybuilder/index.html

Он делает то, что вы хотите.


можно использовать Семантическая Структура Jena (документация SPARQL). Также взгляните на этот вопрос. К сожалению, его синтаксис ближе к SQL PreparedStatement, чем к JPA.


Я только что выпустил бета-проект, чтобы сделать именно это, называется Spanqit.

Я стремился к удобочитаемости и интуитивно понятному интерфейсу, например, вот пример синтаксиса Spanqit для создания запроса:

query.prefix(foaf).select(name)
    .where(x.has(foaf.iri("name"), name))
    .orderBy(name)
    .limit(5)
    .offset(10);

проверьте это, и не стесняйтесь комментировать и предлагать улучшения!