Рубрики
4. Полезняшки

jenabean id (hashCode)

В одной из предыдущих статей я уже писал об использовании связки: jena + jenabean. Следует обратить особое внимание на генерацию идентификаторов объектов в jenabean.

Вот цитата с официального сайта:

WhatsUpWithThat

Questions about Jenabean

Q: Why do I need to annotate my beans with an Id?

Jenabean will create a URI for you, but it needs to know what makes your bean instance unique. Its class path and class name are useful, but it’s still necessary to distinguish between multiple instances of the same class. In the absence of an @Id annotated field or method, Jenabean will use the object’s hash code value (via the hashCode() method of java.lang.Object) but be warned, this is no unique, and will change when the bean is reconstituted from the triple store.

Таким образом, если явно не указать идентификатор, то он будет генерироваться далеко не самым  надежным способом — через hashCode()!


Рубрики
2. Теория программирования 3. Инструментарий

Хранение семантических данных. Связка: Jena / Jenabean + Sparql

1. Jena

В поисках средств для работы с семантическими данными (semantic web) на java можно наткнуться на  следующие решения:

  1. Jena
  2. JRDF
  3. Sesame

В данной статье я хочу рассмотреть работу только с  Jena.  Этот фреймворк достаточно богат по набору  полезных фишек, например

  • он позволяет работать с RDF, RDFS, OWL,
  • осуществлять запросы через  SPARQL,
  • есть возможность читать и писать из N3 и RDF-XML форматов,
  • работать с базами данными Oracle, MySQL, PostgreSQL, HSQLDB, MS SQL Server и Derby.

Исторически, jena является разработкой выращенной в лаборатории Hewlett-Packard в рамках исследований по семантик вебу. Приблизительно с октября 2009 года HP-шники прекратили активные работы над этим проектом и стали его активно опенсорсить (под BSD-подобной лицензией).  Думаю сейчас  разработчики могут спокойно и бесплатно использовать  его без особых проблем.

Для Jena имеется неплохой набор учебных материалов как на самом сайте, так и на других различных ресурсах (например на ibm-ком developerWorks: Introduction to Jena). Структура базовых классов простая и интуитивно понятная. Для примера, привожу краткий набор некоторых основных сущностей в библиотеке:

  • RDFNode — базовый интерфейс для ресурсов или литералов
  • Resource — RDF-ный ресурс (например <http://somewhere/JohnSmith>)
  • Literal — RDF литерал («John Smith»)
  • Property — свойство или предикат (VCard.FN)
  • Statement — триплет «субъект» — «предикат» — «объект»
  • Model — множество триплетов

Неплохую вводную по работе с Jena, можно прочитать на сайте  www.semantictools.ru. Также этом на сайте находится множество полезной информации для людей увлеченных семантическими технологиями.

2. Jenabean

Для связки между JavaBean и RDF хранилищем можно использовать библиотеку jenabean . Способ привязки базируется на аннотациях и чем-то напоминает работу с JPA — аннотациями даются указания каким образом связываются поля класса и данные в хранилище.

Примеры, документацию и саму библиотеку можно скачать на официальной странице  проекта — http://code.google.com/p/jenabean

Также там имеется замечательный скринкаст, в котором показано по шагам (с нуля) работа под NetBeans’e с этой библиотекой. Так что здесь какие-либо мои пояснения по установке и работе библиотеки уже не нужны, достаточно просмотреть видео на сайте.

Далее хотелось уделить особое внимание работе  Jenabean и SPARQL.

SPARQL — язык запроса для выгребания данных из RDF.  С его помощью можно осуществлять довольно хитрые выборки.

Для работы через SPARQL в jenabean можно использовать класс Sparql, который может получать данные из Jena-вской модели (Model — множество триплетов) .

Важно! В jenabean-овском  SPARQL-запросе обязательно должна быть переменная ?s, которая ссылается на требуемый вами объект. Зачем они решили сделать такую жесткую завязку  на ?s мне не понятно, может в следующих версиях придумают что-нибудь покрасивее.

В качестве примере, можно рассмотреть кусок кода — получение списка из 10 (LIMIT 10) статей в порядке их публикации (ORDER BY ?d)  начиная с 20-ой (OFFSET 20) .

String query = "SELECT ?s ?d WHERE " +
"{ ?s a <http: //programador.ru/Article> . ?s </http:><http: //programador.ru/postDate> ?d } " +
"ORDER BY ?d LIMIT 10 OFFSET 20";
LinkedList<article> list = Sparql.exec(model, Article.class, query);
</article></http:>