:- module(import_waisda, [ waisda_to_rdf/0, save_waisda_rdf/1 ]). :- use_module(library(csv)). :- use_module(library(semweb/rdf_db)). :- use_module(library(user_process)). :- use_module(library(video_annotation)). :- use_module(library(count)). :- rdf_register_ns(pprime, 'http://semanticweb.cs.vu.nl/prestoprime/'). :- rdf_register_ns(opmv, 'http://purl.org/net/opmv/ns#'). :- dynamic table_map/3. user:file_search_path(waisda_data, '../data/waisda'). filename(game, 'game.csv'). filename(video, 'video.csv'). filename(tag, 'tag.csv'). filename(tagentry, 'tagentry.csv'). waisda_to_rdf :- debug(waisda_import), retractall(table_map(_,_,_)), games_to_rdf, tags_to_rdf, entries_to_rdf, %rdf_retractall(_,_,_,tag), videos_to_rdf, add_game_users. save_waisda_rdf(File) :- rdf_save(File,[db(waisda)]). games_to_rdf :- waisda_file(game, File), debug(waisda_import, 'reading games', []), csv_read_file(File, [Header|Content], [functor(game)]), length(Content, Length), debug(waisda_import, '~w', [Length]), create_table_map(Header, game), rdf_transaction(assert_games(Content)). assert_games([]). assert_games([T|Ts]) :- table_map_value(game, id, T, Id), table_map_value(game, video_id, T, VideoId), table_map_value(game, starttime, T, StartTime), pprime_url(Id, game, URL), pprime_url(VideoId, video, VideoURL), rdf_assert(URL, rdf:type, pprime:'Game', waisda), rdf_assert(URL, opmv:used, VideoURL, waisda), rdf_assert(URL, opmv:wasStartedAt, literal(StartTime), waisda), assert_games(Ts). videos_to_rdf :- waisda_file(video, File), debug(waisda_import, 'reading videos', []), csv_read_file(File, [Header|Content], [functor(video)]), length(Content, Length), debug(waisda_import, '~w', [Length]), create_table_map(Header, video), rdf_transaction(assert_videos(Content)). assert_videos([]). assert_videos([T|Ts]) :- table_map_value(video, id, T, Id), table_map_value(video, title, T, Title), table_map_value(video, uri_broadband, T, Source), table_map_value(video, category, T, Cat), table_map_value(video, duration, T, Duration0), table_map_value(video, source, T, Provider), table_map_value(video, description, T, Desc), pprime_url(Id, video, URL), pprime_url(Cat, category, CatURL), parse_time(Duration0, Duration), rdf_assert(URL, rdf:type, pprime:'Video', waisda), rdf_assert(URL, dc:title, literal(lang(nl, Title)), waisda), rdf_assert(URL, pprime:source, Source, waisda), rdf_assert(URL, pprime:duration, literal(Duration), waisda), rdf_assert(URL, pprime:provider, literal(Provider), waisda), rdf_assert(URL, pprime:description, literal(lang(nl, Desc)), waisda), rdf_assert(URL, pprime:category, CatURL, waisda), rdf_assert(CatURL, rdfs:label, literal(lang(nl, Cat)), waisda), assert_videos(Ts). entries_to_rdf :- waisda_file(tagentry, File), debug(waisda_import, 'reading tag entries', []), csv_read_file(File, [Header|Content], [functor(tagentry)]), length(Content, Length), debug(waisda_import, '~w', [Length]), create_table_map(Header, tagentry), rdf_transaction(assert_entries(Content)). assert_entries([]). assert_entries([T|Ts]) :- table_map_value(tagentry, id, T, Id), table_map_value(tagentry, game_id, T, GameId), table_map_value(tagentry, player_id, T, PlayerId), table_map_value(tagentry, tag_id, T, TagId), table_map_value(tagentry, time, T, Playhead), table_map_value(tagentry, typingDuration, T, TypingDuration), table_map_value(tagentry, score, T, Score), table_map_value(tagentry, multiplier, T, Multiplier), table_map_value(tagentry, createdOn, T, Date), pprime_url(Id, tagentry, URL), pprime_url(GameId, game, GameURL), pprime_url(PlayerId, player, PlayerURL), pprime_url(TagId, tag, TagURL), %parse_time(Date, iso_8601, Time), rdf(GameURL, opmv:used, VideoURL, waisda), %rdf(TagURL, pprime:hasName, Tag, tag), rdf_assert(VideoURL, pprime:hasAnnotation, URL, waisda), rdf_assert(URL, rdf:type, pprime:'TagEntry', waisda), rdf_assert(URL, opmv:used, GameURL, waisda), rdf_assert(URL, opmv:wasPerformedAt, literal(Date), waisda), rdf_assert(URL, rdf:value, TagURL, waisda), rdf_assert(URL, pprime:videoPlayhead, literal(Playhead), waisda), rdf_assert(URL, pprime:creator, PlayerURL, waisda), rdf_assert(URL, pprime:score, literal(Score), waisda), rdf_assert(URL, pprime:typingDuration, literal(TypingDuration), waisda), rdf_assert(URL, pprime:multiplier, literal(Multiplier), waisda), assert_entries(Ts). tags_to_rdf :- waisda_file(tag, File), debug(waisda_import, 'reading tags', []), csv_read_file(File, [Header|Content], [functor(tag)]), length(Content, Length), debug(waisda_import, '~w', [Length]), create_table_map(Header, tag), rdf_transaction(assert_tags(Content)). assert_tags([]). assert_tags([T|Ts]) :- table_map_value(tag, id, T, Id), table_map_value(tag, name, T, Tag), pprime_url(Id, tag, URL), rdf_assert(URL, rdf:type, pprime:'Tag', waisda), rdf_assert(URL, rdfs:label, literal(Tag), waisda), assert_tags(Ts). %% create_table_map(+Header, +TableMapId) % % create_table_map(Header, Table) :- Header =.. [_|Cols], create_table_map_(Cols, 0, Table). create_table_map_([], _, _). create_table_map_([C|Cs], N, Table) :- N1 is N + 1, assert(table_map(Table, C, N1)), create_table_map_(Cs, N1, Table). %% table_map_value(+TableName, +ColName, +Row, -Value) % % table_map_value(Table, Name, Row, Value) :- table_map(Table, Name, N), !, arg(N, Row, Value). %% pprime_url(+Id, +Specifier, -URL) % % URL in prestoprime namespace. pprime_url(Id, Spec, URL) :- atom_concat(Spec, Id, Local), rdf_global_id(pprime:Local, URL). %% waisda_file(+Which, -AbsoluteFileName) % % AbsoluteFileName for one of filename/2. % Request waisda_data file_search_path to be defined. waisda_file(Which, File) :- filename(Which, FileName), absolute_file_name(waisda_data(FileName), File). /******************************* * Additions * *******************************/ game_stats :- findall(G-N, (rdf(G,rdf:type,pprime:'Game'), game_users(G,Us), length(Us,N) ), Gs), length(Gs, Total), proof_count(member(_-0, Gs), _, Empty), proof_count(member(_-1, Gs), _, Single), proof_count((member(_-N, Gs), N>1), More), format('total: ~w~n empty: ~w~n single: ~w~n multiple: ~w~n', [Total,Empty,Single,More]). add_game_users :- findall(G-Us, (rdf(G,rdf:type,pprime:'Game', waisda), game_users(G,Us) ), Gs), length(Gs, N), rdf_transaction(add_game_users(Gs, N)). add_game_users([], _). add_game_users([Game-Users|Gs], Left) :- Left1 is Left-1, length(Users, N), debug(import_waisda, '~w ~p ~w', [Left,Game,N]), ( N==0 -> rdf_retractall(Game, _, _, waisda) ; assert_game_users(Users, Game) ), add_game_users(Gs, Left1). assert_game_users([], _). assert_game_users([User|Us], Game) :- rdf_assert(Game, opmv:wasPerformedBy, User, waisda), assert_game_users(Us, Game). game_users(Game, Users) :- findall(U, ( rdf(Game, rdf:type, pprime:'Game',waisda), rdf(E,opmv:used,Game), rdf(E,pprime:creator,U) ), Us), sort(Us,Users).