Как улучшить производительность запросов SPARQL в SDB? - PullRequest
1 голос
/ 19 сентября 2011

В моем приложении я использовал базу данных SPARQL - SDB of Jena, а сервер базы данных - DB2. но я считаю, что производительность запросов SPARQL очень низкая.

кто может помочь мне решить эту проблему? Как улучшить производительность запросов sparql, особая производительность запросов в SDB?

Ниже приведены мои тестовые данные и SPARQL:

Контрольный пример :

общее число тройных отсчетов rdf равно 13294. Число тройных отсчетов результата запроса равно 420. на запрос ушло 42 секунды.

SPARQL - :

SELECT DISTINCT ?s ?name ?ownerId ?status ?time 
  ?value ?startTime ?endTime ?description 
WHERE 
{
  ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "http://www.w3c.com/schemas/cp#Event" .
  ?s <http://www.w3c.com/schemas/cp#time> ?time .
  ?s <http://www.w3c.com/schemas/cp#ownerId> ?ownerId .
  ?s <http://www.w3c.com/schemas/cp#name>  ?name .
  ?s <http://www.w3c.com/schemas/cp#value> ?value .
  ?s <http://www.w3c.com/schemas/cp#_status> ?status .
  ?s <http://www.w3c.com/schemas/cp#start_Time> ?startTime .
  ?s <http://www.w3c.com/schemas/cp#end_Time> ?endTime .
  ?s <http://www.w3c.com/schemas/cp#description> ?description .
  FILTER(xsd:dateTime(?time) >= "2011-08-12T00:00:00"^^xsd:dateTime  
    && xsd:dateTime(?time) <= "2011-09-18T23:59:59"^^xsd:dateTime) 
}

1 Ответ

3 голосов
/ 19 сентября 2011

Производительность запросов любого хранилища триплетов, такого как SDB, всегда будет хуже, чем у собственного триплет-хранилища, потому что триплет-хранилище, поддерживаемое SQL, например, SDB, должно скомпилировать SPARQL в SQL, который часто создает ужасно сложные запросы SQL.

Итак, взяв пример, вы попросили сопоставить 9 тройных шаблонов, которые сгенерируют SQL-запрос SELECT, содержащий 9 INNER JOIN операций, для начала которых потребуется много времени.

Затем вы применяете FILTER к этим тройным шаблонам, проблема, с которой вы сталкиваетесь, заключается в том, что, если выражение фильтра не очень простое или недостаточно близко к SQL, чтобы преобразовать в него, FILTER должно быть оценено в Java-код в памяти. На практике это означает, что вы выбираете все возможные события в хранилище триплетов, а затем фильтруете диапазон дат в памяти, используя Java, что всегда замедляет ваш запрос.

Если нет особой причины, по которой вы хотите использовать SDB, я бы действительно посоветовал взглянуть на собственный тройной магазин Jena TDB или TDB2 . Он разработан для того, чтобы делать типы соединений, требуемые для запросов SPARQL, гораздо эффективнее, а способ хранения данных позволяет выполнять более сложные фильтры, такие как диапазон дат, гораздо быстрее.

...