私の以前の投稿に関連する: SWI Prolog で SPARQL クエリをパラメーター化する方法は?
演習のために、 append/3述語のみを使用して SPARQL クエリを構築および実行する述語を実装しようとしましたが(以前の投稿で提案されたソリューションとは異なります)、うまく機能しません。
これは私の述語です:
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/')] ).
"文字を文字列に直接挿入する際に問題が発生したためです (つまり、"を に挿入します。何らかの方法でエスケープすることにより、文字列の最初と最後を表す"文字を に挿入できる ""
かもしれません。知りません。)""
次の方法でクエリを作成しようとしています: Prolog では文字列は ASCII 文字のリストであるため、文字列を表すstring\list Q1を作成しました: 'select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "
、これはクエリの最初の部分です。次に、場所を表す文字列 (たとえば、) になるPlace変数の値を追加して"Roma"
、新しい文字列Q2を作成します。次に、Q2にEnd文字列を追加して、最終的なクエリQueryを作成します。endはクエリの最後の部分です: % End = @en }}'私の最後のクエリ、クエリ、および必要な他の 2 つのパラメーター (前の投稿の適切な動作例のように)。
問題は、それが機能していないように見えることです。Prolog シェルで、次のコマンドを実行します。
必要な SPARQL ライブラリをロードするには:
?- 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.
述語を実行します。
?- 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
ご覧のとおり、エラーになります。奇妙なことに、クエリの値 (write/1 を使用して出力したもの) は問題ないようです。実際、ASCII リストを文字に変換すると、その値は次のようになります。
'select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "Roma"@it }'
それは私の元のクエリです (したがって、クエリ文字列は正しい方法で構築されるようです) が、問題は他のsparql_query/3 パラメータにあるようです。なんで?私は何が欠けていますか?