Easy RDF库未返回正确的RDF值

时间:2014-06-09 07:39:20

标签: php rdf easyrdf

我有一个远程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文件中获取值。使用它的节点和子节点。 请看看并帮助我。

1 个答案:

答案 0 :(得分:0)

文档远未完成,很难在本主题中找到任何相关内容。您只需深入了解代码或在此处提出问题即可:https://groups.google.com/forum/#!forum/easyrdf

primaryTopic()方法永远不会起作用

根据Graph classprimaryTopic()执行此操作:

        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:creatorrdf:type pgterms:agent,但它没有其他属性,也没有代理......我无法找出问题所在。我检查了$graph->resources(),丢失属性的值在生成的ID下,似乎与$ebook没有联系。所以我猜解析不太顺利。这可能是EasyRdf错误,或者这可能是RDF文件本身的问题。我会在讨论论坛上询问,也许他们会提供答案。