1

私は次の問題に夢中になっています:

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述語を呼び出すにはどうすればよいですか?

4

1 に答える 1