1

我对以下问题感到抓狂:

我有一个谓词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谓词?

4

1 回答 1

1

当我必须格式化复杂的字符串时,我确实更喜欢format /2 。我解决了你的问题

execute([FirstToken|_Tail], TokenValue, OccurrencesPlaces) :-
    arg(2, FirstToken, TokenValue),
    format(atom(Place), '"~s"', [TokenValue]),
    makeQuery(Place, _Query, OccurrencesPlaces),
    write(OccurrencesPlaces).

Daniel 的建议也应该有效。

于 2013-05-31T18:06:55.070 回答