我有一个远程RDF文件,我想从那里获取一些数据。它位于远程服务器上,示例数据运行良好,但很快我就解析了我的文件--它开始给出错误。我正在使用简单的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文件中获取值。使用它的节点和子节点。请看一看,帮我脱身。
发布于 2014-06-09 09:48:16
文档还远未完成,很难找到与此主题相关的任何内容。要进一步理解,您所能做的就是深入了解代码,或者在这里问您的问题:https://groups.google.com/forum/#!forum/easyrdf。
primaryTopic()方法永远不会起作用
根据图类,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:type of pgterms:agent,但它没有其他属性,也没有代理.我找不出是什么问题。我检查了$graph->resources(),缺少的属性的值在生成的ID下面,这些ID似乎与$ebook没有任何联系。所以我想解析不太顺利。这可能是EasyRdf错误,也可能是RDF文件本身的问题。我会在讨论论坛上问这个问题,也许他们会给出一个答案。
https://stackoverflow.com/questions/24115736
复制相似问题