:- use_module(library(odbc)). open :- odbc_connect('WordNet', _, [ user(jan), password(geheim), alias(wordnet), open(once) ]). :- dynamic qid/2. word(Id, Word) :- nonvar(Id), qid(word(+, -), Qid), !, odbc_execute(Qid, [Id], row(Word)). word(Id, Word) :- nonvar(Word), qid(word(-, +), Qid), !, odbc_execute(Qid, [Word], row(Id)). word(Id, Word) :- var(Id), var(Word), !, open, odbc_query(wordnet, 'SELECT * from word', row(Id, Word)). word(Id, Word) :- nonvar(Id), open, odbc_prepare(wordnet, 'SELECT (lemma) FROM word WHERE wordno=?', [ integer ], Qid), assert(qid(word(+, -), Qid)), word(Id, Word). word(Id, Word) :- nonvar(Word), open, odbc_prepare(wordnet, 'SELECT (wordno) FROM word WHERE lemma=?', [ default ], Qid, [ types([integer]) ]), assert(qid(word(-, +), Qid)), word(Id, Word). /******************************* * TEST * *******************************/ word_by_query(Id, Word) :- odbc_prepare(wordnet, 'SELECT (lemma) FROM word WHERE wordno=?', [ integer ], Qid), odbc_execute(Qid, [Id], row(Word)), odbc_free_statement(Qid). word_direct(Id, Word) :- odbc_query(wordnet, 'SELECT (lemma) from word where wordno=~w'-[Id], row(Word)). prof_by_query(N) :- ( between(0, N, _), Id is random(140000), word_by_query(Id, _), fail ; true ). prof_direct(N) :- ( between(0, N, _), Id is random(140000), word_direct(Id, _), fail ; true ). all_lemmas_1(Words) :- odbc_query(wordnet, 'select (wordno) from word', Words, [ findall(Word, row(Word)), types([integer]) ]). all_lemmas_2(Words) :- findall(Word, odbc_query(wordnet, 'select (wordno) from word', row(Word), [ types([integer]) ]), Words). /******************************* * PROFILE * *******************************/ prof_word(N) :- ( between(0, N, _), Id is random(140000), % format('wordno = ~w~n', [Id]), word(Id, _), fail ; true ). prof_word2(N) :- ( between(0, N, _), Id is random(140000), sformat(SQL, 'SELECT * FROM word WHERE wordno=~w', [Id]), db_select('WordNet', SQL, tuple(_, _Word)), % format('~w --> ~w~n', [Id, Word]), fail ; true ).