1

我有一个远程 RDF 文件,我想从中获取一些数据。它在远程服务器上,示例数据工作 100% 正常,但很快我解析我的文件,它开始给出错误。我正在使用 Easy RDF 库。

这是他们提供的示例:

<?php
    set_include_path(get_include_path() . PATH_SEPARATOR . '../lib/');
    require_once "EasyRdf.php";
?>
<html>
<head>
  <title>Basic FOAF example</title>
</head>
<body>

<?php
  $foaf = EasyRdf_Graph::newAndLoad('http://njh.me/foaf.rdf');
  $me = $foaf->primaryTopic();
?>

<p>
  My name is: <?= $me->get('foaf:name') ?>
</p>

</body>
</html>

这是我遇到错误的示例。

<?php
    set_include_path(get_include_path() . PATH_SEPARATOR . '../lib/');
    require_once "EasyRdf.php";
?>
<html>
<head>
  <title>Basic FOAF example</title>
</head>
<body>

<?php
  $foaf = EasyRdf_Graph::newAndLoad('http://gutenberg.readingroo.ms/cache/generated/4500/pg4500.rdf');
  $me = $foaf->primaryTopic();
?>

<p>
  My name is: <?= $me->get('dcterms:title') ?>
</p>

</body>
</html>

我得到的错误:

My name is: 
Fatal error: Call to a member function get() on a non-object in D:\xampp\htdocs\giftcardbooks\easyrdf\examples\basic.php on line 31

我的最终目标是从 RDF 文件中获取值。使用它的节点和子节点。请看看并帮助我摆脱它。

4

1 回答 1

0

文档远未完成,很难找到与该主题相关的任何内容。为了进一步理解,您所能做的就是深入研究代码,或者在这里提问:https ://groups.google.com/forum/#!forum/easyrdf 。

这种primaryTopic()方法永远不会奏效

根据Graph 类,这样primaryTopic()做:

        return $this->get(
            $resource,
            'foaf:primaryTopic|^foaf:isPrimaryTopicOf',
            'resource'
        );

这意味着它正在寻找与 有某种关系的资源foaf:primaryTopic。您的get()调用返回null,因为您的 RDF 不包含这样的资源。

目前这适用于我的 RDF

<html>
<head>
    <title>Basic FOAF example</title>
</head>
<body>

<?php
/** @var EasyRdf_Graph $graph */
$graph = EasyRdf_Graph::newAndLoad('http://gutenberg.readingroo.ms/cache/generated/4500/pg4500.rdf');

/** @var EasyRdf_Resource $book */
$book = $graph->resource('http://gutenberg.readingroo.ms/cache/generated/4500/ebooks/4500'); //returns the ebook resource

$title = $book->get('dcterms:title'); //returns a literal node
?>

<p>
    My name is: <?php echo $title; //calls the __toString() of the literal node
?>
</p>

</body>
</html>

获得的另一种方法$book

$book = current($graph->resources());

由于这本书是一个根节点,它将是图中的第一个资源......

我认为没有办法让这本书使用pgterms:ebook

这是因为 EasyRdf 不将其识别为一种类型。我认为这是因为它没有在任何地方定义为rdfs:Class,它只是被使用,但这只是一个猜测,以确保您必须检查代码。也不是类型,dcterms:title但它可以用作资源属性......

var_dump($graph->types($book))
->
array(1) {
  [0]=>
  NULL
}

解析为 XML

使用 XML 解析器解析 RDF 文件要容易得多:

$dom = simplexml_load_file('http://gutenberg.readingroo.ms/cache/generated/4500/pg4500.rdf');
$title = (string) current($dom->xpath('//rdf:RDF/pgterms:ebook/dcterms:title'));
$name = (string) current($dom->xpath('//rdf:RDF/pgterms:ebook/dcterms:creator/pgterms:agent/pgterms:name'));
echo $title;
echo $name;

我认为 EasyRdf 或您的 RDF 文件中存在问题,但我找不到使用 EasyRdf 获取名称的方法。dcterms:creator有 的,rdf:typepgterms:agent它没有其他属性,也没有代理......我无法找出问题所在。我检查了$graph->resources()并且缺少属性的值在生成的 ID 下,似乎与$ebook. 所以我猜解析不太好。这可能是 EasyRdf 错误,也可能是 RDF 文件本身的问题。我会在讨论区问​​这个问题,也许他们会提供答案。

于 2014-06-09T09:48:16.587 回答