2013-05-29 3 views
1

Мне трудно сделать следующий запрос SPARQL параметрическим.Как параметризовать запрос SPARQL в SWI Prolog?

Сначала я загрузить библиотеку запрос:

?- use_module(library(semweb/sparql_client)). 
% library(uri) compiled into uri 0.02 sec, 290,256 bytes 
% library(readutil) compiled into read_util 0.00 sec, 17,464 bytes 
% library(socket) compiled into socket 0.00 sec, 11,936 bytes 
% library(option) compiled into swi_option 0.00 sec, 14,288 bytes 
% library(base64) compiled into base64 0.00 sec, 17,912 bytes 
% library(debug) compiled into prolog_debug 0.00 sec, 21,864 bytes 
% library(http/http_open) compiled into http_open 0.03 sec, 438,368 bytes 
% library(sgml) compiled into sgml 0.00 sec, 39,480 bytes 
%  library(quintus) compiled into quintus 0.00 sec, 23,896 bytes 
% rewrite compiled into rewrite 0.01 sec, 35,336 bytes 
% library(record) compiled into record 0.00 sec, 31,368 bytes 
% rdf_parser compiled into rdf_parser 0.01 sec, 132,840 bytes 
% library(gensym) compiled into gensym 0.00 sec, 4,792 bytes 
% rdf_triple compiled into rdf_triple 0.00 sec, 39,672 bytes 
% library(rdf) compiled into rdf 0.01 sec, 244,240 bytes 
% library(semweb/sparql_client) compiled into sparql_client 0.04 sec, 707,080 bytes 
true. 

У меня есть этот запрос, который, как вы можете видеть, кажется, работает хорошо:

?- sparql_query('select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "Pescara"@it.}', Row, [ host('dbpedia.org'), path('/sparql/')]). 
Row = row(literal(type('http://www.w3.org/2001/XMLSchema#integer', '1'))). 

Моя проблема заключается в том, что я хочу, этот запрос будет параметрический. В предыдущем примере значение Pescara фиксировано и должно быть переменной. У меня есть что-то вроде:

?- Place = 'Roma' 

и в запросе:

?- sparql_query('select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label [email protected]}', Row, [ host('dbpedia.org'), path('/sparql/')]). 

Это не похоже на работу.

ответ

3

Вы можете использовать atom_concat/3 и atomic_list_concat/3.

:- val('select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label [email protected]}'). 

12 ?- Z='rdfs:label $', val(X), atom_concat(A,B,X), atom_concat(Z,C,B), 
     atom_concat('Place',D,C), Place='"Roma"', 
     atomic_list_concat([A,Z,Place,D],R). 
..... 
Place = '"Roma"', 
R = 'select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label $"Roma"@it.}' ; 
false. 

, а затем

?- sparql_query($R, Row, [ host('dbpedia.org'), path('/sparql/')]). 

Или, просто,

makeQuery(Place, Query, Row) :- %% e.g. Place = '"Rome"' 
    atomic_list_concat([ 'select COUNT(*) where {?place a dbpedia-owl:Place ;', 
     ' rdfs:label $', Place, '@it.}'], Query), 
    sparql_query(Query, Row, [ host('dbpedia.org'), path('/sparql/')]). 
+0

Тпх так много ... на самом деле мне нужен предикат, который генерирует этот запрос, что-то вроде buildQuery (Place, Query) где Place - это переменная для вставки в строку запроса Query, теперь я пытаюсь использовать ваш пример, чтобы сделать это сам ... но если для вас это не проблема и я могу показать мне эту версию, я буду вам очень признателен потому что я спешу доставить этот проект моему учителю : -/ – AndreaNobili

+0

mmm предикат makeQuery/3 исправить и сказать мне: ? - makeQuery («Рома», Query, Row). ОШИБКА: atomic_list_concat/2: Ошибка типа: «текст» ожидается, найдено '[82,111,109,97] – AndreaNobili

+0

не' 'Roma" ',' '"Roma"' '. Посмотрите внимательно на код в моем ответе. –