我无法从内部Prolog谓词调用参数化SPARQL查询

时间:2013-05-30 20:21:51

标签: prolog sparql semantic-web

我对以下问题感到疯狂:

我有一个谓词 makeQuery / 3 ,它构建了一个参数化的SPARQL查询来询问DBpedia,这个:

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 shell中运行良好,实际上我可以传递一个特定的 Place 参数,然后检查这是否是使用DbPedia的地方,这是我的输出Prolog shell:

[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”',我认为这意味着罗姆人是一个原子(或者是错误的解释?)

好的,这项工作很好,我的结果()发现了这样的事情,对我来说,罗马就是一个地方!!!

现在我发现了一个大问题:这个makeQuery / 3谓词必须由其他谓词使用,而不是在Prolog shell中使用,我不能将它用于其他谓词。

我创建了以下执行/ 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 < / strong>,标识符渐进数令牌内容,它是ASCII列表,表示作为单词的字符串

例如,前一个标记有1作为标识符,其内容可以显示字符串 Roma (这是一个地方,因此查询会发现一个事件)

好的,所以这个谓词将 TokenValue 变量放入字符串并执行之前的 makeQuery / 2 谓词传递给我的 TokenValue 值(在前面的示例中为字符串 Roma

现在在prolog shell中我做了:

[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 谓词?如上例所示?

1 个答案:

答案 0 :(得分:1)

我更喜欢format / 2,当我必须 - 好 - 格式化复杂的字符串。 我用

解决了你的问题
execute([FirstToken|_Tail], TokenValue, OccurrencesPlaces) :-
    arg(2, FirstToken, TokenValue),
    format(atom(Place), '"~s"', [TokenValue]),
    makeQuery(Place, _Query, OccurrencesPlaces),
    write(OccurrencesPlaces).

丹尼尔建议的内容也应该有效。