我有一个远程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文件中获取值。使用它的节点和子节点。 请看看并帮助我。
答案 0 :(得分:0)
文档远未完成,很难在本主题中找到任何相关内容。您只需深入了解代码或在此处提出问题即可:https://groups.google.com/forum/#!forum/easyrdf。
primaryTopic()
方法永远不会起作用根据Graph class,primaryTopic()
执行此操作:
return $this->get(
$resource,
'foaf:primaryTopic|^foaf:isPrimaryTopicOf',
'resource'
);
这意味着它正在寻找与foaf:primaryTopic
存在某种关系的资源。您的get()
调用返回null
,因为您的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解析器解析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
pgterms:agent
,但它没有其他属性,也没有代理......我无法找出问题所在。我检查了$graph->resources()
,丢失属性的值在生成的ID下,似乎与$ebook
没有联系。所以我猜解析不太顺利。这可能是EasyRdf错误,或者这可能是RDF文件本身的问题。我会在讨论论坛上询问,也许他们会提供答案。