2013-05-30 39 views
1

我要瘋了以下問題的參數SPARQL查詢:我不能調用來自內部的Prolog謂詞

我有一個謂語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的外殼很好地工作,其實我可以通過它特定的廣場參數,然後檢查,如果這是使用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'))). 

正如你所看到的參數都以這種方式被傳遞:「‘羅馬’」,我認爲,這意味着,羅馬是原子

(或者是理解錯了?)好的,這個工作很好,我的結果()發現一個事件,所以,對我來說,羅姆人是一個地方!

現在我發現一個大問題:這個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])具有一個噸:算符,一個標識符漸進數令牌的內容是ASCII的rappresenting一個字符串,是一個字)

列表

例如先前的令牌具有1作爲識別符和它的內容rappresent字符串羅馬(即一個地方,以便查詢將發現的發生)

好了,所以這個謂詞放在TokenValue可變串並執行以前makeQuery/2謂詞將其傳遞給我的TokenValue值(上例中的字符串羅馬

現在在序言殼我做的:

[debug] ?- SystemTokenized = [t(1, [82, 111, 109, 97])]. 
SystemTokenized = [t(1, [82, 111, 109, 97])]. 

,現在我叫執行/ 3謂詞傳遞給它SystemTokenized:

[debug] ?- execute($SystemTokenized, TokenValue, OccurrencePlaces). 
t(1,[82,111,109,97]) 
false. 

正如你看到的,似乎沒有很好地工作,因爲我傳遞字符串羅馬到查詢作爲參數,但我認爲有一些問題,因爲它不是一個原子或類似的東西......

我想從幾個小時來解決,但我不能找到一個解決方案

所以我的問題是:如何才能從另一個調用謂詞取參數像以前的執行/ 3謂詞例?

+2

'atom_codes(A,「Roma」),atomic_list_concat([''',A,'''',Result).' –

回答

1

我喜歡format/2時,我有 - 嘿 - 格式複雜的字符串。 我

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

什麼丹尼爾認爲應該工作以及解決您的問題。

+0

tnx so much,now I will study in details this snippet :-) – AndreaNobili