swi - prolog list
Creando una consulta parametrizada SPARQL usando append/3 predicate (1)
Relacionado con mi publicación anterior: ¿cómo parametrizar una consulta SPARQL en SWI Prolog?
Para hacer ejercicio, estaba tratando de implementar un predicado que construya y ejecute una consulta SPARQL usando solo el predicado append / 3 (de manera diferente a la solución propuesta en mi publicación anterior) pero no funciona bien.
Este es mi predicado:
buildQuery(Place, Query, Row) :-
% Q1 = ''select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "
Q1 = [39, 115, 101, 108, 101, 99, 116, 32, 67, 79, 85, 78, 84, 40, 42, 41, 32, 119, 104, 101, 114, 101, 32, 123, 63, 112, 108, 97, 99,
101, 32, 97, 32, 100, 98, 112, 101, 100, 105, 97, 45, 111, 119, 108, 58, 80, 108, 97, 99, 101, 32, 59, 32, 114, 100, 102, 115, 58,
108, 97, 98, 101, 108, 32, 34],
append(Q1, Place, Q2),
%End = @en }}''
End = [34, 64, 105, 116, 32, 125, 39],
append(Q2, End, Query),
sparql_query(Query, Row, [ host(''dbpedia.org''), path(''/sparql/'')] ).
Porque he encontrado algún problema insertando el " carácter directamente en una cadena. (Es decir, poniendo " en ""
; tal vez puedo poner un " carácter en ""
que representa el principio y el final de una cadena escapándola en de alguna manera. No lo sé.)
Estoy intentando crear mi consulta de la siguiente manera: en Prolog, una cadena es una lista de caracteres ASCII, así que he creado una cadena / list Q1 que representa la cadena: ''select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "
''select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "
, que es la primera parte de mi consulta. Luego agrego el valor de la variable Place que será una cadena que representa un lugar (por ejemplo, "Roma"
), creando la nueva cadena Q2 . Añado la cadena End a Q2 creando la consulta final Query , donde end es la última parte de mi consulta: % End = @en}} '' Finalmente, ejecuto la consulta SPARQL por sparql_query / 3 predicado incorporado, pasando a mi consulta final, consulta y los otros dos parámetros necesarios (como en el buen ejemplo de trabajo de la publicación anterior).
El problema es que parece no funcionar. En el shell Prolog ejecuto el siguiente comando:
Para cargar la biblioteca SPARQL necesaria:
?- 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.01 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.01 sec, 39,480 bytes % library(quintus) compiled into quintus 0.00 sec, 23,896 bytes % rewrite compiled into rewrite 0.00 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.02 sec, 244,240 bytes % library(semweb/sparql_client) compiled into sparql_client 0.06 sec, 707,080 bytes true.
Ejecuto mi predicado:
?- buildQuery("Roma", Query, Row), write(Query). ERROR: uri:uri_query_components/2: Type error: `atomic'' expected, found `[39,115,101,108,101,99,116,32,67,79,85,78,84,40,42,41,32,119,104,101,114,101,32,123,63,112,108,97,99,101,32,97,32,100,98,112,101,100,105,97,45,111,119,108,58,80,108,97,99,101,32,59,32,114,100,102,115,58,108,97,98,101,108,32,34,82,111,109,97,34,64,105,116,32,125,39]'' ^ Exception: (12) ignore(http_open:parts_search([protocol(http), host(''dbpedia.org''), port(80), path(''/sparql/''), search([...])], _G1079)) ? creep
Como puede ver, entra en un error. Lo extraño es que mi valor de Consulta (lo imprimí usando write / 1) parece estar bien. De hecho, si traduzco la lista ASCII a caracteres, su valor es:
''seleccione COUNT (*) donde {? place a dbpedia-owl: Place; rdfs: etiqueta "Roma" @it} ''
Esa es mi consulta original (por lo que parece que la cadena de consulta se compilará correctamente) pero parece que el problema está en el parámetro sparql_query / 3 y esto es extraño porque se copió de la solución de publicación anterior que funciona muy bien. ¿Por qué? ¿Qué me estoy perdiendo?
Obtiene el error porque el argumento Query (first) de sparql_query / 3 es un átomo. Entonces, la forma más simple de construir su consulta es
atomic_list_concat([ ''select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "'',
Place,
''"@en }''
], Query),
sparql_query(Query, Row, [ host(''dbpedia.org''), path(''/sparql/'')] ).
Tenga en cuenta que esto solo funciona siempre que Place des no contenga una comilla doble u otro carácter especial según lo define la sintaxis de la cadena SPARQL.