私は次の問題に夢中になっています:
DBpedia に問い合わせるためのパラメトリック SPARQL クエリを作成する述語makeQuery/3があります。
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/')] ).
ご覧のとおり、Prolog シェルでうまく機能します。実際、特定のPlaceパラメーターを渡すと、これが DbPedia を使用する場所であるかどうかを確認できます。これが私の Prolog シェルでの出力です。
[debug] ?- makeQuery('"Roma"', Query, Row).
Query = 'select COUNT(*) where {?place a dbpedia-owl:Place ; rdfs:label "Roma"@it.}',
Row = row(literal(type('http://www.w3.org/2001/XMLSchema#integer', '1'))).
パラメータを'"Roma"' のように渡す必要があることがわかるように、これは Roma がアトムであることを意味していると思います (または間違った解釈ですか?)
わかりました、この作業は私の結果 ( Row ) に影響を与えるので、私にとってローマは場所です!!!
今、私は大きな問題を見つけています:この makeQuery/3 述語は、Prolog シェルではなく、他の述語で使用する必要があり、他の述語で使用することはできません。
それを使用しようとする次のexecute/2述語を作成しました。
execute([FirstToken|Tail], TokenValue, OccurrencesPlaces) :-
write(FirstToken),
arg(2, FirstToken, TokenValue),
atom_codes(Atom, TokenValue),
makeQuery(Atom, Query, OccurrencesPlaces),
write(OccurrencesPlaces).
この述語はトークンのリストを取ります (私にとってトークンは次のようなものです: t(1, [82, 111, 109, 97])は、t: functor、識別子プログレッシブ番号、およびトークンの内容のリストです。単語である文字列を表す ASCII rappresenting)
たとえば、前のトークンは識別子として 1 を持ち、そのコンテンツは文字列Romaを rappresent します(これは、クエリが出現を検出する場所です)。
さて、この述語は文字列をTokenValue変数に入れ、前のmakeQuery/2述語を実行してそれに私のTokenValue値を渡します (前の例では文字列Roma )
プロローグシェルで次のことを行います。
[debug] ?- SystemTokenized = [t(1, [82, 111, 109, 97])].
SystemTokenized = [t(1, [82, 111, 109, 97])].
次に、 execute/3述語を呼び出して SystemTokenized に渡します。
[debug] ?- execute($SystemTokenized, TokenValue, OccurrencePlaces).
t(1,[82,111,109,97])
false.
ご覧のとおり、文字列Romaをパラメーターとしてクエリに渡しているため、うまく機能していないようですが、アトムなどではないため、問題があると思います...
数時間から解決しようとしていますが、解決策が見つかりません
だから私の問題は:前の例のように、パラメーターを取る別の述語からexecute/3述語を呼び出すにはどうすればよいですか?