|
Эндрю Мэттьюс Оригинал: 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<Track> ctx = new RdfSparqlContext<Track>(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<Track> ctx = new RdfSparqlContext<Track>(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
- Десериализовать результаты в объекты
- Выдать результат (возможно по мере десериализации)
Это очень грубый набросок предстоящих задач. Я буду объяснять значительно более детально в последующих статьях, по мере того, как я буду продвигаться. Перевод: Михаил Навернюк |