Example #1
0
 public function build()
 {
     $article = $this->Agent->getArticle();
     $text = $article->getContent(true);
     # Strip comments and <nowiki>
     $text = preg_replace("/<!--.*?-->/s", "", $text);
     $text = preg_replace("@<nowiki>.*?</nowiki>@s", "", $text);
     # change template usage to substitution; note that this is WRONG
     #$tchars = Title::legalChars();
     #$text = preg_replace("/(?<!{){{([$tchars]+)(\|.*?)?}}(?!})/", "{{subst:$1$2}}", $text);
     $parser = new Parser();
     # so the magic variables work out right
     $parser->mOptions = new ParserOptions();
     $parser->mTitle = $this->Agent->getTitle();
     $parser->mOutputType = OT_WIKI;
     $parser->initialiseVariables();
     $parser->clearState();
     $text = $parser->replaceVariables($text);
     preg_match_all("@<rdf>(.*?)</rdf>@s", $text, $matches, PREG_PATTERN_ORDER);
     $content = $matches[1];
     $rdf = implode(' ', array_values($content));
     $model = MwRdf::Model();
     if (strlen($rdf) > 0) {
         $parser->mOutputType = OT_HTML;
         $rdf = $parser->replaceVariables($rdf);
         $turtle_parser = MwRdf::Parser('turtle');
         $base_uri = $this->Agent->getTitle()->getFullUrl();
         $prelude = MwRdf::getNamespacePrelude();
         $model->loadStatementsFromString($turtle_parser, $prelude . $rdf);
     }
     return $model;
 }
Example #2
0
 public function testThatTheInPageModelIsStoredCorrectlyInContext()
 {
     $this->agent->storeModel('inpage');
     $store = MwRdf::StoredModel();
     $context = $this->agent->getContextNode('inpage');
     $model = $this->agent->buildModel('inpage');
     $this->assertModelContainsModelInContext($store, $model, $context, "The inpage RDF model has not been successfully stored and retrieved.");
 }
Example #3
0
 public function retrieve()
 {
     $sm = MwRdf::StoredModel();
     $model = MwRdf::Model();
     $context = $this->Agent->getContextNode($this->getName());
     $stream = librdf_model_context_as_stream($sm->getModel(), $context->getNode());
     librdf_model_add_statements($model->getModel(), $stream);
     librdf_free_stream($stream);
     $sm->rewind();
     return $model;
 }
Example #4
0
 public function retrieve()
 {
     $base_uri = $this->Agent->getTitle()->getFullUrl();
     $query = MwRdf::Query($this->getQueryString(), $base_uri, 'sparql');
     $store = MwRdf::StoredModel();
     $res = $query->execute($store);
     $model = MwRdf::Model();
     foreach ($res as $statement) {
         $model->addStatement($statement);
     }
     return $model;
 }
Example #5
0
 /**
  * As with QueryPage, this is the actual workhorse. It does everything
  * needed to make a real, honest-to-gosh query page.
  *
  * @param $offset database query offset
  * @param $limit database query limit
  * @param $shownavigation show navigation like "next 200"?
  */
 function doQuery($offset, $limit, $shownavigation = true)
 {
     global $wgUser, $wgOut, $wgContLang;
     $this->offset = $offset;
     $this->limit = $limit;
     $sname = $this->getName();
     $fname = get_class($this) . '::doQuery';
     $sk = $wgUser->getSkin();
     $wgOut->setSyndicated($this->isSyndicated());
     $query = MwRdf::Query($this->getQuery(), $this->getBaseUrl(), $this->getQueryLanguage());
     $librdf_res = $query->execute(MwRdf::StoredModel());
     # let's just dump the tuples into a normal php array shall
     # we?  This will avoid memory management hassels.
     $res = array();
     foreach ($librdf_res as $tuple) {
         $res[] = $tuple;
     }
     $num = count($res);
     $res = $this->preprocessResults($res);
     if ($shownavigation) {
         $wgOut->addHTML($this->getPageHeader());
         $top = wfShowingResults($offset, $num);
         $wgOut->addHTML("<p>{$top}\n");
         # often disable 'next' link when we reach the end
         $atend = $num < $limit;
         $sl = wfViewPrevNext($offset, $limit, $wgContLang->specialPage($sname), wfArrayToCGI($this->linkParameters()), $atend);
         $wgOut->addHTML("<br />{$sl}</p>\n");
     }
     if ($num > 0) {
         $s = array();
         if (!$this->listoutput) {
             $s[] = "<ol start='" . ($offset + 1) . "' class='special'>";
         }
         # here's where we do the offset and limit
         for ($i = $offset; $i < $num && $i < $offset + $limit; $i++) {
             $format = $this->formatResult($sk, $res[$i]);
             if ($format) {
                 $s[] = $this->listoutput ? $format : "<li>{$format}</li>\n";
             }
         }
         if (!$this->listoutput) {
             $s[] = '</ol>';
         }
         $str = $this->listoutput ? $wgContLang->listToText($s) : implode('', $s);
         $wgOut->addHTML($str);
     }
     if ($shownavigation) {
         $wgOut->addHTML("<p>{$sl}</p>\n");
     }
     return $num;
 }
Example #6
0
 public function build()
 {
     $dc = MwRdf::Vocabulary('dc');
     $model = MwRdf::Model();
     $ar = $this->Agent->titleResource();
     $categories = $this->Agent->getTitle()->getParentCategories();
     if (is_array($categories)) {
         foreach (array_keys($categories) as $category) {
             $catmf = MwRdf::ModelingAgent(Title::newFromText($category));
             $model->addStatement(MwRdf::Statement($ar, $dc->subject, $catmf->titleResource()));
         }
     }
     return $model;
 }
Example #7
0
 public function build()
 {
     $dcterms = MwRdf::Vocabulary('dcterms');
     $model = MwRdf::Model();
     $tr = $this->Agent->titleResource();
     $dbr = wfGetDB(DB_SLAVE);
     $res = $dbr->select('pagelinks', array('pl_namespace', 'pl_title'), array('pl_from = ' . $this->Agent->getTitle()->getArticleID()), 'MwRdfLinksFrom', array('ORDER BY' => 'pl_namespace, pl_title'));
     while ($res && ($row = $dbr->fetchObject($res))) {
         $lt = Title::makeTitle($row->pl_namespace, $row->pl_title);
         $ltmf = MwRdf::ModelingAgent($lt);
         $model->addStatement(MwRdf::Statement($tr, $dcterms->references, $ltmf->titleResource()));
     }
     $dbr->freeResult($res);
     return $model;
 }
Example #8
0
 public function build()
 {
     global $wgRightsUrl;
     $rdf = MwRdf::Vocabulary('rdf');
     $cc = MwRdf::Vocabulary('cc');
     $model = MwRdf::Model();
     $tr = $this->Agent->titleResource();
     $model->addStatement(MwRdf::Statement($tr, $rdf->a, $cc->Work));
     if (!isset($wgRightsUrl)) {
         return $model;
     }
     $lr = MwRdf::UriNode($wgRightsUrl);
     $model->addStatement(MwRdf::Statement($tr, $cc->license, $lr));
     $model->addStatement(MwRdf::Statement($lr, $rdf->a, $cc->License));
     $terms = MwRdf::GetCcTerms($wgRightsUrl);
     if (!isset($terms)) {
         return $model;
     }
     foreach ($terms as $term) {
         switch ($term) {
             case 're':
                 $model->addStatement(MwRdf::Statement($lr, $cc->permits, $cc->Reproduction));
                 break;
             case 'di':
                 $model->addStatement(MwRdf::Statement($lr, $cc->permits, $cc->Distribution));
                 break;
             case 'de':
                 $model->addStatement(MwRdf::Statement($lr, $cc->permits, $cc->DerivativeWorks));
                 break;
             case 'nc':
                 $model->addStatement(MwRdf::Statement($lr, $cc->prohibits, $cc->CommercialUse));
                 break;
             case 'no':
                 $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->Notice));
                 break;
             case 'by':
                 $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->Attribution));
                 break;
             case 'sa':
                 $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->ShareAlike));
                 break;
             case 'sc':
                 $model->addStatement(MwRdf::Statement($lr, $cc->requires, $cc->SourceCode));
                 break;
         }
     }
     return $model;
 }
Example #9
0
 public function build()
 {
     global $wgContLang;
     $dc = MwRdf::Vocabulary('dc');
     $dcterms = MwRdf::Vocabulary('dcterms');
     $rdfs = MwRdf::Vocabulary('rdfs');
     $model = MwRdf::Model();
     $tr = $this->Agent->titleResource();
     $article = $this->Agent->getArticle();
     $text = $article->getContent(true);
     $parser = new Parser();
     $parser->mOptions = new ParserOptions();
     $parser->mTitle = $this;
     $parser->initialiseVariables();
     $parser->clearState();
     $tags = array('nowiki');
     $m = array();
     $text = $parser->extractTagsAndParams($tags, $text, $m);
     # XXX: maybe it would actually be better to do this at another
     # stage after the parser has already identified interwiki and
     # lang links
     # Find prefixed links
     preg_match_all("/\\[\\[([^|\\]]+:[^|\\]]+)(\\|.*)?\\]\\]/", $text, $m);
     if (!isset($m[0])) {
         return $model;
     }
     // nothing found so nevermind
     foreach ($m[1] as $linktext) {
         $iwlink = Title::newFromText($linktext);
         if (isset($iwlink)) {
             $pfx = $iwlink->getInterwiki();
             if (strlen($pfx) > 0) {
                 $iwlinkmf = MwRdf::ModelingAgent($iwlink);
                 $iwr = $iwlinkmf->titleResource();
                 # XXX: Wikitravel uses some 4+ prefixes for sister site links
                 if ($wgContLang->getLanguageName($pfx) && strlen($pfx) < 4) {
                     $model->addStatement(MwRdf::Statement($tr, $dcterms->hasVersion, $iwr));
                     $model->addStatement(MwRdf::Statement($iwr, $dc->language, MwRdf::Language($pfx)));
                 } else {
                     # XXX: Express the "sister site" relationship better
                     $model->addStatement(MwRdf::Statement($tr, $rdfs->seeAlso, $iwr));
                 }
             }
         }
     }
     return $model;
 }
Example #10
0
 public function build()
 {
     global $wgServer;
     $dc = MwRdf::Vocabulary('dc');
     $dcterms = MwRdf::Vocabulary('dcterms');
     $dctype = MwRdf::Vocabulary('dctype');
     $model = MwRdf::Model();
     $tr = $this->Agent->titleResource();
     $dbr = wfGetDB(DB_SLAVE);
     $res = $dbr->select('imagelinks', array('il_to'), array('il_from = ' . $this->Agent->getTitle()->getArticleID()), 'MwRdfImage');
     while ($res && ($row = $dbr->fetchObject($res))) {
         $img = wfFindFile($row->il_to);
         if (!$img->exists()) {
             continue;
         }
         $iuri = $img->getURL();
         if ($iuri[0] == '/') {
             $iuri = $wgServer . $iuri;
         }
         $ir = MwRdf::UriNode($iuri);
         $model->addStatement(MwRdf::Statement($tr, $dcterms->hasPart, $ir));
         $model->addStatement(MwRdf::Statement($ir, $dc->type, $dctype->Image));
         $mt = $img->getMimeType();
         if (isset($mt)) {
             $model->addStatement(MwRdf::Statement($ir, $dc->format, MwRdf::MediaType($mt)));
         }
         $hist_line = $img->nextHistoryLine();
         if (!isset($hist_line)) {
             continue;
         }
         $creator = MwRdf::PersonToResource($hist_line->img_user, $hist_line->img_user_text, User::whoIsReal($hist_line->img_user));
         $model->addStatement(MwRdf::Statement($ir, $dc->creator, $creator));
         $model->addStatement(MwRdf::Statement($ir, $dc->date, MwRdf::TimestampResource($hist_line->img_timestamp)));
         $seen = array($hist_line->img_user => true);
         while ($hist_line = $img->nextHistoryLine()) {
             if (isset($seen[$hist_line->img_user])) {
                 continue;
             }
             $contributor = MwRdf::PersonToResource($hist_line->img_user, $hist_line->img_user_text, User::whoIsReal($hist_line->img_user));
             $model->addStatement(MwRdf::Statement($ir, $dc->contributor, $contributor));
             $seen[$hist_line->img_user] = true;
         }
     }
     $dbr->freeResult($res);
     return $model;
 }
Example #11
0
 public function build()
 {
     global $wgSitename, $wgContLanguageCode;
     $article = $this->Agent->getArticle();
     $model = MwRdf::Model();
     $rdf = MwRdf::Vocabulary('rdf');
     $dc = MwRdf::Vocabulary('dc');
     $dctype = MwRdf::Vocabulary('dctype');
     $artres = $this->Agent->titleResource();
     $model->addStatement(MwRdf::Statement($artres, $dc->title, MwRdf::LiteralNode($this->Agent->getTitle()->getText())));
     $model->addStatement(MwRdf::Statement($artres, $dc->publisher, MwRdf::PageOrString(wfMsg('aboutpage'), $wgSitename)));
     $model->addStatement(MwRdf::Statement($artres, $dc->language, MwRdf::Language($wgContLanguageCode)));
     $model->addStatement(MwRdf::Statement($artres, $dc->type, $dctype->Text));
     $model->addStatement(MwRdf::Statement($artres, $dc->format, MwRdf::MediaType('text/html')));
     if ($this->Agent->getTimestampResource()) {
         $model->addStatement(MwRdf::Statement($artres, $dc->date, $this->Agent->getTimestampResource()));
     }
     if (MWNamespace::isTalk($this->Agent->getTitle()->getNamespace())) {
         $model->addStatement(MwRdf::Statement($artres, $dc->subject, $this->Agent->subjectResource()));
     } else {
         $talk = MwRdf::ModelingAgent($this->Agent->getTitle()->getTalkPage());
         $model->addStatement(MwRdf::Statement($talk->titleResource(), $dc->subject, $artres));
     }
     # 'Creator' is responsible for this version
     $creator = MwRdf::PersonToResource($article->getUser());
     $model->addStatement(MwRdf::Statement($artres, $dc->creator, $creator));
     # 'Contributors' are all other version authors
     $contributors = $article->getContributors();
     foreach ($contributors as $user_parts) {
         $contributor = MwRdf::PersonToResource($user_parts[0], $user_parts[1], $user_parts[2]);
         $model->addStatement(MwRdf::Statement($artres, $dc->contributor, $contributor));
     }
     # Rights notification
     global $wgRightsPage, $wgRightsUrl, $wgRightsText;
     $rights = MwRdf::RightsResource();
     if ($rights) {
         $model->addStatement(MwRdf::Statement($artres, $dc->rights, $rights));
     }
     return $model;
 }
Example #12
0
 public function build()
 {
     global $wgContLanguageCode;
     $dc = MwRdf::Vocabulary('dc');
     $dcterms = MwRdf::Vocabulary('dcterms');
     $model = MwRdf::Model();
     $tr = $this->Agent->titleResource();
     $dbr = wfGetDB(DB_SLAVE);
     $res = $dbr->select(array('page', 'revision'), array('rev_id', 'rev_timestamp', 'rev_user', 'rev_user_text'), array('page_namespace = ' . $this->Agent->getTitle()->getNamespace(), 'page_title = ' . $dbr->addQuotes($this->Agent->getTitle()->getDBkey()), 'rev_page = page_id', 'rev_id != page_latest'), 'MwRdfHistory', array('ORDER BY' => 'rev_timestamp DESC'));
     while ($res && ($row = $dbr->fetchObject($res))) {
         $url = $this->Agent->getTitle()->getFullURL('oldid=' . $row->rev_id);
         $ur = MwRdf::UriNode($url);
         $model->addStatement(MwRdf::Statement($tr, $dcterms->hasVersion, $ur));
         $model->addStatement(MwRdf::Statement($ur, $dcterms->isVersionOf, $tr));
         $model->addStatement(MwRdf::Statement($ur, $dc->language, MwRdf::Language($wgContLanguageCode)));
         $realname = $row->rev_user == 0 ? null : User::whoIsReal($row->rev_user);
         $pr = MwRdf::PersonToResource($row->rev_user, $row->rev_user_text, $realname);
         $model->addStatement(MwRdf::Statement($ur, $dc->creator, $pr));
         $model->addStatement(MwRdf::Statement($ur, $dc->date, MwRdf::TimestampResource($row->rev_timestamp)));
     }
     $dbr->freeResult($res);
     return $model;
 }
Example #13
0
 public function testLoad()
 {
     $agent = MwRdf::ModelingAgent($this->title);
     for ($i = 0; $i < 10000; $i++) {
         $model = $agent->retrieveModel('inpage');
         $this->assertType('object', $model);
         $this->assertTrue($model instanceof LibRDF_Model);
         $statement = MwRdf::Statement(MwRdf::UriNode('http://www.w3.org/TR/rdf-syntax-grammar'), MwRdf::UriNode('http://purl.org/dc/elements/1.1/title'), MwRdf::LiteralNode('RDF/XML Syntax Specification (Revised)'));
         $this->assertTrue($model->hasStatement($statement));
         $statements = $model->findStatements(MwRdf::UriNode('http://www.w3.org/TR/rdf-syntax-grammar'), MwRdf::UriNode('http://example.org/stuff/1.0/editor'), null);
         $this->assertType('object', $statements);
         $this->assertTrue($statements instanceof LibRDF_StreamIterator);
         $statement = $statements->current();
         $this->assertTrue($statement instanceof LibRdf_Statement);
         $editor = $statement->getObject();
         $this->assertTrue($editor instanceof LibRdf_BlankNode);
         $statement = MwRdf::Statement($editor, MwRdf::UriNode('http://example.org/stuff/1.0/fullname'), MwRdf::LiteralNode("Dave Beckett"));
         $this->assertTrue($model->hasStatement($statement));
         $statement = MwRdf::Statement($editor, MwRdf::UriNode('http://example.org/stuff/1.0/homePage'), MwRdf::UriNode('http://purl.org/net/dajobe/'));
         $this->assertTrue($model->hasStatement($statement));
         $model->rewind();
     }
 }
Example #14
0
 public function getQuery()
 {
     $ns = MwRdf::Vocabulary('dc')->getNS();
     return "\n\t\t\tPREFIX dc: <{$ns}>\n\t\t\tSELECT ?url ?title\n\t\t\tWHERE { ?url dc:title ?title } ";
 }
Example #15
0
function wfRdfSpecialPage($par)
{
    global $wgRequest, $wgOut, $_SERVER, $_REQUEST;
    MwRdf::setup();
    $target = $wgRequest->getVal('target');
    if (!isset($target) || $target == null) {
        # no target parameter
        MwRdf::ShowForm();
        return;
    }
    if (strlen($target) == 0) {
        # no target contents
        MwRdf::ShowForm(wfMsg('badtitle'));
        return;
    }
    $nt = Title::newFromText($target);
    if ($nt->getArticleID() == 0) {
        # not an article
        MwRdf::ShowForm(wfMsg('badtitle'));
        return;
    }
    $format = $wgRequest->getVal('format', 'rdfxml');
    $accept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null;
    $rdftype = wfNegotiateType(wfAcceptToPrefs($accept), wfAcceptToPrefs(MwRdf::getTypePrefs($format)));
    if (!$rdftype) {
        wfHttpError(406, "Not Acceptable", wfMsg("notacceptable"));
        return false;
    }
    $wgOut->disable();
    if (!headers_sent()) {
        header("Content-type: {$rdftype}");
    }
    $wgOut->sendCacheControl();
    $mf = MwRdf::ModelingAgent($nt);
    # Note: WebRequest chokes on arrays here
    $modelnames = null;
    if (isset($_REQUEST['modelnames'])) {
        $modelnames = $_REQUEST['modelnames'];
    }
    if (is_null($modelnames)) {
        $modelnames = $mf->listDefaultModels();
    }
    if (is_string($modelnames)) {
        $modelnames = explode(',', $modelnames);
    }
    if (!$modelnames) {
        MwRdf::ShowForm(wfMsg('nomodelsselected'));
        return;
    }
    $model = $mf->retrieveModel($modelnames);
    if (!$model->current()) {
        $mf->storeAllModels();
        $model = $mf->retrieveModel($modelnames);
    }
    $ser = MwRdf::Serializer($format);
    $text = $model->serializeStatements($ser);
    # XXX: Test Hook: it would be better if we could capture the
    # print statement below with an output buffer, but that is
    # disabled for the CLI in PHP 5
    if (isset($_SERVER['CONTEXT']) && $_SERVER['CONTEXT'] == 'phpunit test') {
        return $text;
    } else {
        print $text;
        return true;
    }
}
Example #16
0
 public function testTimestamp()
 {
     $this->markTestIncomplete();
     $pagename = self::$username . '/NonArticle';
     $title = Title::newFromText($pagename, NS_USER);
     if ($title->exists()) {
         $article = new Article($title);
         $article->doPurge();
     }
     $agent = MwRdf::ModelingAgent($title);
     $this->assertType('boolean', $agent->getTimestampResource());
     $this->assertFalse($agent->getTimestampResource());
 }
Example #17
0
 public function getQueryString()
 {
     $url = $this->Agent->getTitle()->getFullUrl();
     $ns = MwRdf::Vocabulary('dcterms')->getNS();
     return "PREFIX dcterms: <{$ns}>\n\t\t\tCONSTRUCT { <{$url}> dcterms:isReferencedBy ?x }\n\t\t\tWHERE { ?x dcterms:references <{$url}> } ";
 }
 public function testGetCcTerms()
 {
     $license = 'http://creativecommons.org/licenses/by-sa/1.0/';
     $terms = MwRdf::GetCcTerms($license);
     $this->assertType('array', $terms, $license);
     $this->assertContains('re', $terms);
     $this->assertContains('di', $terms);
     $this->assertContains('de', $terms);
     $this->assertContains('no', $terms);
     $this->assertContains('by', $terms);
     $this->assertContains('sa', $terms);
     $license = 'http://creativecommons.org/licenses/by-nc-sa/1.0/';
     $terms = MwRdf::GetCcTerms($license);
     $this->assertType('array', $terms, $license);
     $this->assertContains('re', $terms);
     $this->assertContains('di', $terms);
     $this->assertContains('de', $terms);
     $this->assertContains('no', $terms);
     $this->assertContains('by', $terms);
     $this->assertContains('sa', $terms);
     $this->assertContains('nc', $terms);
     $license = 'http://creativecommons.org/licenses/GPL/2.0/';
     $terms = MwRdf::GetCcTerms($license);
     $this->assertType('array', $terms, $license);
     $this->assertContains('de', $terms);
     $this->assertContains('re', $terms);
     $this->assertContains('di', $terms);
     $this->assertContains('no', $terms);
     $this->assertContains('sa', $terms);
     $this->assertContains('sc', $terms);
     $license = 'http://creativecommons.org/licenses/LGPL/2.1/';
     $terms = MwRdf::GetCcTerms($license);
     $this->assertType('array', $terms, $license);
     $this->assertContains('de', $terms);
     $this->assertContains('re', $terms);
     $this->assertContains('di', $terms);
     $this->assertContains('no', $terms);
     $this->assertContains('sa', $terms);
     $this->assertContains('sc', $terms);
     $license = 'http://www.gnu.org/copyleft/fdl.html';
     $terms = MwRdf::GetCcTerms($license);
     $this->assertType('array', $terms, $license);
     $this->assertContains('de', $terms);
     $this->assertContains('re', $terms);
     $this->assertContains('di', $terms);
     $this->assertContains('no', $terms);
     $this->assertContains('sa', $terms);
     $this->assertContains('sc', $terms);
 }
Example #19
0
 public function __construct()
 {
     foreach ($this as $key => $value) {
         $this->{$key} = MwRdf::UriNode($this->getNS() . $key);
     }
 }
Example #20
0
 public function clearStoredModel($name)
 {
     $context = $this->getContextNode($name);
     $store = MwRdf::StoredModel();
     librdf_model_context_remove_statements($store->getModel(), $context->getNode());
     $store->rewind();
     $store = null;
     # __destruct() causes a segfault
 }
Example #21
0
 public function cleanup()
 {
     if (self::$Store) {
         self::$Store = null;
     }
     if (self::$StoredModel) {
         self::$StoredModel = null;
     }
 }
Example #22
0
 public function testShowFormWithMessage()
 {
     $msg = 'this is a message';
     MwRdf::ShowForm($msg);
     $this->assertContains($msg, $this->html);
 }
Example #23
0
if ($page_count < $start) {
    fwrite(STDOUT, "-1");
    exit(1);
}
MwRdf::Setup();
$dbr = wfGetDB(DB_SLAVE);
$res = $dbr->query("\n\tSELECT page_id,\n\tpage_title,\n\tpage_namespace,\n\tpage_is_redirect\n\tFROM page\n\tORDER BY page_id\n\tLIMIT 200\n\tOFFSET {$start}");
while ($s = $dbr->fetchObject($res)) {
    if ($s->page_is_redirect) {
        continue;
    }
    $title = Title::makeTitle($s->page_namespace, $s->page_title);
    if (!$title) {
        continue;
    }
    $agent = MwRdf::ModelingAgent($title);
    fwrite(STDERR, $s->page_id . ": " . $title->getPrefixedDbKey());
    $agent->storeAllModels();
    $agent = null;
    $title = null;
    fwrite(STDERR, "\n");
}
fwrite(STDOUT, $start + 200);
function get_total_number_of_articles()
{
    $dbr = wfGetDB(DB_SLAVE);
    # get the total number of articles
    $page = $dbr->tableName('page');
    $res = $dbr->query("select count( page_id ) as page_count from {$page};");
    $s = $dbr->fetchObject($res);
    return $s->page_count;