我对以下问题感到疯狂:
我有一个谓词 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 谓词?如上例所示?
答案 0 :(得分:1)
我更喜欢format / 2,当我必须 - 好 - 格式化复杂的字符串。 我用
解决了你的问题execute([FirstToken|_Tail], TokenValue, OccurrencesPlaces) :-
arg(2, FirstToken, TokenValue),
format(atom(Place), '"~s"', [TokenValue]),
makeQuery(Place, _Query, OccurrencesPlaces),
write(OccurrencesPlaces).
丹尼尔建议的内容也应该有效。