2014年1月22日水曜日

バックアップ&リストア

ビルトーソにはもろちん、バックアップ&リストア機能があります。

まずバックアップするには、

ビルトーソのコンダクターから、
System Admin -> Backup
にいきます。

Backup File Prefix
にバックアップファイル名の先頭につけたい文字を入力します。
とりあえず「unko」とでも入力しておきます。
(ただし後から変更できないので要注意です。)

Run Incremental Backup
ボタンをPUSHします。

すると、ビルトーソのdbディレクトリに、
xxxx1.bp
xxxx2.bp
というファイルができます。
これに全部のデータが入っています。

※dbディレクトリは人によって違うかもしれませんが、おそらくこのへんです。
/usr/local/var/lib/virtuoso/db


つづいて、リストアするには、

ビルトーソサーバを止めます。

dbディレクトリに移動します。
既存のdbファイルが存在しているとリカバリできないので、
どこかに移動しておきます。
# mv virtuoso-temp.db どこか
# mv virtuoso.db どこか

リストアコマンドを打ち込みます。
# virtuoso-t +restore-backup unko
※「unko」は上記で入力した「Backup File Prefix」です。

するとリカバリ処理が進みます。
イカのようにログが流れます。

                Wed Jan 22 2014
11:58:59 { Loading plugin 1: Type `plain', file `wikiv' in `/usr/local/lib/virtuoso/hosting'
11:58:59   WikiV version 0.6 from OpenLink Software
11:58:59   Support functions for WikiV collaboration tool
11:58:59   SUCCESS plugin 1: loaded from /usr/local/lib/virtuoso/hosting/wikiv.so }
11:58:59 { Loading plugin 2: Type `plain', file `mediawiki' in `/usr/local/lib/virtuoso/hosting'
11:58:59   MediaWiki version 0.1 from OpenLink Software
11:58:59   Support functions for MediaWiki collaboration tool
11:58:59   SUCCESS plugin 2: loaded from /usr/local/lib/virtuoso/hosting/mediawiki.so }
11:58:59 { Loading plugin 3: Type `plain', file `creolewiki' in `/usr/local/lib/virtuoso/hosting'
11:58:59   CreoleWiki version 0.1 from OpenLink Software
11:58:59   Support functions for CreoleWiki collaboration tool
11:58:59   SUCCESS plugin 3: loaded from /usr/local/lib/virtuoso/hosting/creolewiki.so }
11:58:59 OpenLink Virtuoso Universal Server
11:58:59 Version 06.01.3127-pthreads for Linux as of Dec 25 2013
11:58:59 uses parts of OpenSSL, PCRE, Html Tidy
11:58:59 Begin to restore with file prefix unko
11:58:59 --> Backup file # 1 [0xC8D5-0x0B-0x25]
11:59:07 --> Backup file # 2 [0xC8D5-0x0B-0x25]
12:00:11 End of restoring from backup, 12516 pages
12:00:11 Server exiting

リカバリ処理が止まったら、ビルトーソを起動します。
# virtuoso-t -df &

すると、元通り!

詳しくはここに書いてます。
http://docs.openlinksw.com/virtuoso/backup.html

2014年1月20日月曜日

ビルトーソとリッジレーサーの関係

PSVITA版のリッジレーサーには、
なんと、
VIRTUOSOという曲が入っています。


まさかゲームをやっててVIRTUOSOのスペルを見るとは思いもよりませんでした。
ビルトーソの影響力はすごいですね!

2014年1月9日木曜日

トリプルとかクアッドとか

SPARQLの世界では、トリプルとかクアッドとか言います。

スパークルでは、データを3つセットでDBに格納しまして、主語、述語、目的語をセットにしてトリプルといいます。

トリプル=Subject,Predicate,Object


さらに、グラフという、トリプルのまとまりとなる要素を付け加えて、クアッドといいます。

クアッド=Graph,Subject,Predicate,Object


CRAWL_LINK_EXTRACT 関数

WS.WS.SITEMAP_BB_PARSE から呼び出される関数です。
リンクを抽出して、次のクロール対象となるようにキュー登録します。
完全オリジナルです。
 
create procedure WS.WS.CRAWL_LINK_EXTRACT (
  in _content varchar,
  in _regexp varchar,
  in _host varchar,
  in _root varchar
)
{
dbg_obj_print('WS.WS.CRAWL_LINK_EXTRACT');
declare link varchar;
link := regexp_match(_regexp,_content,1);
while(link is not null) {
  declare url varchar;
  url := regexp_substr(_regexp,link,1);
  if (left(url,2) = '//') {
    url := null;
  }
  if (left(url,1) = '/') {
    url := 'http://' || _host || url;
  } else {
    url := null;
  }
  if (regexp_match('https?://'||_host,url) is null) {
    url := null;
  }
  if (url is not null) {
    insert soft VFS_QUEUE (VQ_HOST, VQ_TS, VQ_URL, VQ_STAT, VQ_ROOT, VQ_OTHER) values (_host, now(), url, 'waiting', _root, NULL);
    dbg_obj_print(url);
  }
  link := regexp_match(_regexp,_content,1);
}
}

CRAWL_REGEXP_TO_QUAD関数


WS.WS.SITEMAP_BB_PARSE から呼び出される関数です。
正規表現で項目を取り出して、SPARQLのDBに保存します。
完全オリジナル関数です。

create procedure WS.WS.CRAWL_REGEXP_TO_QUAD (
  in _content varchar,
  in _regexp varchar,
  in _graph varchar,
  in _subject varchar,
  in _predicate varchar
)
{
dbg_obj_print('WS.WS.CRAWL_REGEXP_TO_QUAD');
--parse
DECLARE value varchar;
value := regexp_substr(_regexp,_content,1);
dbg_obj_print(value);
--make sparql
declare sparql_str varchar;
sparql_str := sprintf('sparql insert in graph <%s> { <%s> <%s> "%s"}', _graph,_subject,_predicate,value);
--exec sparql
declare stat, msg varchar;
declare mdata, rset any;
exec (sparql_str, stat, msg, vector(), 1, mdata, rset);
}

Extract Function で項目抽出!!

Extract Functionで項目抽出してみます。
WS.WS.CRAWL_REGEXP_TO_QUAD関数と、
WS.WS.CRAWL_LINK_EXTRACT関数の中身は、
別記事に書いてあります。

create procedure WS.WS.SITEMAP_BB_PARSE (
  in _host varchar,
  in _url varchar,
  in _root varchar,
  inout _content varchar, 
  in _c_type varchar := null,
  in lev int := 0)
{
dbg_obj_print('sitemap_bb_parse by hodade v3');
dbg_obj_print('_host='||_host);
dbg_obj_print('_url='||_url);
dbg_obj_print('_root='||_root);
dbg_obj_print('_c_type='||_c_type);
dbg_obj_print('lev='||lev);
declare graph varchar;
graph := 'http://'||_host;
declare subject varchar;
subject := _url;
--#################
-- ボキャブラリ設定
--#################
WS.WS.CRAWL_REGEXP_TO_QUAD(
  _content,
  '<title>(.+?)</title>',
  graph,
  subject,
  'title'
);
WS.WS.CRAWL_REGEXP_TO_QUAD(
  _content,
  '<th width="100">.+?</th><td>(.+?)</td>',
  graph,
  subject,
  'address'
);
--##############
-- リンク抽出
--##############
WS.WS.CRAWL_LINK_EXTRACT(
  _content,
  '<a .*?href="(.+?/spot/.*?)".*?>',
  _host,
  _root
);
  commit work;
}

Store Function を設定すると・・・

ちなみに、
Store Function を設定すると、なぜか、
DAVへのコンテンツ保存が行われなくなります。

コンテンツ保存はその指定した Store Function の中でやれよと言うことなのでしょうか。

使わないことにします。


クロールに苦労する

クロール設定画面に下記の項目がありますが、

Store Function   
Extract Function   


ここにプログラムの場所を指定すると、
クロールしたコンテンツからデータの抽出を行うことができます。

プログラムは、Databaseに格納しておきましょう。


このようになっている場合、Extract Function には WS.WS.SITEMAP_BB_PARSE と書けばOKです。


クロールしてみる


クロールするには、Content Imports の画面へ行きます。
主な設定項目はこんなかんじ。

Target URL   
    起点のURL
   
Copy to local DAV collection   
    クロールしたコンテンツの保存先、
    Store documents locallyにチェックを入れるとここに保存される。
   
Number of HTTP redirects to follow   
    許可するリダイレクト回数
   
Crawling depth limit   
    クロール階層の深さ
   
Crawl delay(sec)   
    クロール間隔
   
Store Function   
    項目抽出プログラムを指定するところ
   
Extract Function   
    リンク抽出プログラムを指定するところ
   
Store documents locally   
    クロールしたコンテンツを保存するかどうか


これでクロールすると、
DAVの中にコンテンツがまるっと保存されます。


2014年1月8日水曜日

管理画面に日本語が入力できない

管理画面に日本語を入力して、登録すると・・・
ごちゃごちゃした文字になっちゃいます。

日本語をキーワードとして抽出する場合には致命的です。
困りました。

Shift_JISには弱いビルさん

クロールもできるビルさん、実はShift_JISにめっぽう弱いです。
Shift_JISは全く扱えません。
日本人には残念でなりません。

apacheと連携

ビルさんはアパッチけんと連携できます。
アパッチを通してビルさんにアクセスさせることができます。

アパッチ側でリバースプロキシの設定をするのです。(mod_proxy)
 http://techwiki.openstructs.org/index.php/Proxying_Virtuoso_Via_Apache2

 こうすると、アパッチでアクセス制限などをすることができます。


INSERT SOFT ?

Virtuosoには INSERT SOFT というSQLがあり、
主キーを持つ行がすでに存在する場合はインサートしません。

INSERT INTO だとエラーになるところです、あぶないあぶない。


Store FunctionとExtract Functionが実行される順番

管理画面上は、

Store Function
Extract Function

の順で、設定項目が上から並んでいますが、
実際の実行順序は、

1.Extract Function
2.Store Function

となっているので注意が必要です。


Parse Function に渡される内容

Parse Functionには下記の引数が渡ってきます。

_host            ホスト名
_url            パス
_root            保存場所
_content        コンテンツ内容
_c_type            コンテントタイプ
lev                階層レベル

これらのデータを、ごにょごにょして、
DBに格納したりします。

httpsのサイトをクロールできない?

ビルトーソには優秀なクロール機能が備わっています。
あるサイトを定期的にクロールさせてビルトーソ内のDBに保存することができます。
しかしながら、クロール対象サイトにhttps://で始まるURLを登録すると、次に見た瞬間、http://に変換されているのです。
これはビルさんが、https対応していないという意思表示なのでしょうか?

2014年1月6日月曜日

SPARQLサンプル

【全データ】
SELECT * WHERE { ?s ?p ?o }

【件数】
SELECT COUNT(*) WHERE { ?s ?p ?o }

【グラフ毎の件数】
SELECT ?g count(?g) WHERE {GRAPH ?g {?s ?p ?o}} GROUP BY ?g

【指定のsubjectがどのグラフに属するかGETする】
SELECT * WHERE { GRAPH ?g {<http://xxx.xxx.xxx/> ?p ?o }}

【あるグラフ配下のデータを表示】
SELECT * WHERE { GRAPH <http://xxx.xxx.xxx> {?s ?p ?o }}

ビルトーソに役立つリンク集

スパークルエンドポイントからクロールするやりかた
http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtCrawlerSPARQLEndpoints   
   
Extract FunctionとStore Functionの例   
http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtSetCrawlerJobsGuideSemanticSitemapsFuncExample   
   
コンダクターの使い方がずらっと載っているページ   
http://docs.openlinksw.com/virtuoso/htmlconductorbar.html   
   
virtuosoフォーラム   
http://boards.openlinksw.com/support/viewforum.php?f=11&sid=b0206111471d072e209d1b143c4abbd5
   
   
Virtuosoのドキュメント   
http://docs.openlinksw.com/virtuoso/
   
   
Virtuosoをソースからインストールする方法   
http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VOSCentosNotes
   

VirtuosoPL言語メモ


デバッグプリント
dbg_obj_print('hoge');


文字連結器号は
||


コメントアウトは行頭に
--

更新系のSPARQLが実行できるようにするには

Interactive SQL (ISQL)から下記のSPARQLを実行しておきます。

grant execute on SPARQL_INSERT_DICT_CONTENT to "SPARQL";
grant execute on SPARQL_INSERT_DICT_CONTENT to "SPARQL_UPDATE";
grant execute on SPARQL_DELETE_DICT_CONTENT to "SPARQL";


Interactive SQL (ISQL)には、Conductorから行けます。
ヴィルさんの管理画面のことを、コンダクターと言うのです。










proxy内部にビルトーソを設置した場合


virtuoso.ini
を変更する必要があります。


以下を変更








HTTPProxyEnabled                = 1














以下を追加








HTTPProxyServer                 = proxy.xxxxx.xxx.xxx:8080


HTTPProxyExceptions             = localhost:8890,127.0.0.1:8890

Virtuoso

それは

ビルトーソ

と読みます。



ビルさんは、SPARQLのDBだったり、WEBサーバになったり、クローラになったりできます。VirtuosoPLとか、VirtuosoServerPagesとかの独自言語も持ってます。

ビルさん一つでなんでもできそうです、すごい。