SQLの、?とか:name使うの、バインド値、プレースホルダというのかー。
リンク元ノード数:
sqlite> SELECT count(id) FROM papers WHERE id IN(SELECT id FROM papers GROUP BY pmid);
N=396732
…却下。
とりあえず、これ:
SELECT DISTINCT cited_pmid as pmid FROM papers INTERSECT SELECT DISTINCT pmid as pmid FROM papers;
N=198734について考えることにする
sqlite> CREATE TABLE pmids AS SELECT DISTINCT cited_pmid as pmid FROM papers INTERSECT SELECT DISTINCT pmid as pmid FROM papers;
sqlite> select count(*) from pmids;
198734
※一方、もういっかい、sqliteのDB作り直しも走らせたが……終わってない。
隣接行列じゃなくて、(from, to, value)版のpagerankを考えないと…。
pagerank:
E = e*t(e)/nにより、P = αP + (1−α)Eと修正する(nはノード数)。v=Pv。
行列にしない前提で考えるので、
繰り返しは
- ゼロ列(outlinkが無い)の要素を見たときは:
- レコードが存在しない
- 1/n*Σv[i]とする
- [x,j]レコードが存在:
- α*Σv[i]*(score)[i,j]+(1−α)/n
Pの修正:
- 各ページに対して、少なくともリンク総数を求める必要がある。
- 「SELECT count(id) FROM papers GROUP BY cited_pmid WHERE pmid==?」を=n、
- 「UPDATE papers SET value=(求めた値1/n) WHERE pmid==?」とする
- 転置。
- sqlから呼ぶときは、リンク先(pmid)基準で引いて、これをつかうのでいい。