我对以下问题感到抓狂:
我有一个谓词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"',我认为这意味着 Roma 是一个原子(或者是错误的解释?)
好的,这项工作很好,事实上我的结果(Row)发现了一个事件,所以对我来说,罗马是一个地方!
现在我发现了一个大问题:这个 makeQuery/3 谓词必须由其他谓词使用,而不是在 Prolog shell 中,我不能将它用于其他谓词。
我创建了以下尝试使用它的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 表示一个字符串,它是一个单词)
例如,前一个标记有 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谓词?