Менеджер MP3 файлов на основе RDF и C# — Часть 3

Эндрю Мэттьюс
Оригинал: Using RDF and C# to create an MP3 Manager — Part 3

Прошлый раз я кратко показал, как вы можете выполнить следующий шаг на пути превращения RDF хранилища в ORM систему. Цель всей этой деятельности, и причина, по которой я перестал писать статьи в моем блоге о LINQ, была в том, что я работаю над системой, которая позволит мне использовать LINQ совместно с RDF хранилищем и механизмом логического вывода. Достоинство этой системы заключается в том, что мы сможем одновременно воспользоваться как преимуществами современного реляционного мира, так и всей мощью нового мира семантического веба. В этой статье я собираюсь кратко описать шаги, необходимые для того, чтобы начать работу над «LINQ для RDF» (так я назвал этот проект в силу отсутствия воображения).

Я всегда использую разработку, управляемую тестами, поэтому я уже могу показать вам несколько ‘сводных’ модульных тестов:

 

[TestMethod
]
public
void Query
(
)
{
string urlToRemoteSparqlEndpoint
=
"http://localhost/MyMusicService/SparqlQuery.ashx"; RdfContext
ctx
=
new RdfSparqlContext

(urlToRemoteSparqlEndpoint
); var titles
= from t
in ctx where t.
Year
>
1998
&& t.
GenreName
==
"Ambient Techno"
|| t.
GenreName
==
"Chillout" select t.
Title;
foreach
(
string title
in titles
) Console.
WriteLine
(title
);
}

Говоря простым языком, это означает, что прежде чем манипулировать локальным RDF хранилищем, я хочу, чтобы RdfSparqlContext сформировал SPARQL запрос и переслал его точке доступа расположенной по адресу, указанному в urlToRemoteSparqlEndpoint. Затем я хочу, чтобы он десериализовал полученные результаты и сохранил в объектах title. Это будет замечательной смесью новых возможностей .NET 3.5, и функциональности, которую я разработал для десериализации объектов.

В примере выше меня больше занимают аспекты запросов LINQ (как универсального языка запросов), но это не слишком полезно для меня, с точки зрения разработки в рамках транзакционного веба, которой я занимаюсь последнее время, так что нам необходима полная поддержка операций CRUD в нашей системе. Далее вы можете видеть модульный тест для обновления объекта.

 

[TestMethod
]
public
void Update
(
)
{
string urlToRemoteSparqlEndpoint
= @”http
:
//localhost/MyMusicService/SparqlQuery.ashx”; RdfContext
ctx
=
new RdfSparqlContext

(urlToRemoteSparqlEndpoint
); var q
= from t
in ctx where t.
Year
>
1998
&& t.
GenreName
== “Ambient Techno”
|| t.
GenreName
== “Chillout” select t;
foreach
(Track t
in q
) t.
Rating
=
5; ctx.
AcceptChanges
(
);
}

Здесь я получаю пачку объектов из хранилища, изменяю их свойство “Rating”, и затем сохраняю изменения. Я следую стилю, принятому в LINQ для SQL.

В конечном счете, я намереваюсь удовлетворить эти модульные тесты (плюс другие тесты для остальных операций CRUD, для поддержки N3, хранилищ в памяти, и в реляционных базах данных). Вот общая схема для реализации запросов с использованием LINQ. Она предполагает, что структуры данных RDF берутся из библиотеки SemWeb без изменений.

  • Создать объект Query (Я думаю это будет наш класс RdfContext описанный выше)
  • Реализовать IQueryable для него
  • Когда запрашивается энумератор, преобразовать сохраненное дерево выражения в целевой язык
  • Переслать его в хранилище или в точку доступа SPARQL
  • Десериализовать результаты в объекты
  • Выдать результат (возможно по мере десериализации)

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

Перевод: Михаил Навернюк