Как построить SPARQL-запросы в Java? - PullRequest
9 голосов
/ 31 августа 2011

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

Аналог (для SQL): Самый простой способ построить строку SQL в Java

Ответы [ 8 ]

7 голосов
/ 07 декабря 2012

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

Этот класс называется 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.

6 голосов
/ 31 августа 2011

Вы можете строить запросы программно в 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

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

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

3 голосов
/ 14 апреля 2016

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

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, который имеет все удобные методы для добавления < > вокруг URI, экранирующих специальных символов и т. Д.

3 голосов
/ 06 марта 2014

Я реализовал 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();
2 голосов
/ 05 сентября 2011

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

String query = "SELECT * WHERE {?X ?P ?Y }";
TupleQuery preparedQuery = conn.prepareQuery(QuerLanguage.SPARQL, query);
preparedQuery.setBinding("X", someValue);
...
TupleQueryResult result = preparedQuery.evaluate();
1 голос
/ 07 января 2015

Jena предоставляет QueryBuilder в пакете Extras.

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

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

0 голосов
/ 10 ноября 2014

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

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

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

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

0 голосов
/ 31 августа 2011

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

...