首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用xpath从RDF文件中获取子节点的值

如何使用xpath从RDF文件中获取子节点的值
EN

Stack Overflow用户
提问于 2014-06-11 08:36:27
回答 1查看 473关注 0票数 1

这里的问题是如何使用xpath从RDF文件中获取子节点。

在这里,您可以看到这些节点集多次使用:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xml:base="http://www.gutenberg.org/"
  xmlns:pgterms="http://www.gutenberg.org/2009/pgterms/"
  xmlns:cc="http://web.resource.org/cc/"
  xmlns:dcam="http://purl.org/dc/dcam/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:marcrel="http://id.loc.gov/vocabulary/relators/"
  xmlns:dcterms="http://purl.org/dc/terms/"
>
  <pgterms:ebook rdf:about="ebooks/45916">
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/files/45916/45916-h.zip">
        <dcterms:format>
          <rdf:Description rdf:nodeID="N8bcaca7a1c7d421bb84e17512209a18e">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">text/html; charset=iso-8859-1</rdf:value>
          </rdf:Description>
        </dcterms:format>
        <dcterms:format>
          <rdf:Description rdf:nodeID="Nf2b3fd0a0a8846708ffa66bef504ceb3">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">application/zip</rdf:value>
          </rdf:Description>
        </dcterms:format>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T09:02:38</dcterms:modified>
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">651365</dcterms:extent>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/ebooks/45916.kindle.noimages">
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T22:26:22.432333</dcterms:modified>
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1123982</dcterms:extent>
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:format>
          <rdf:Description rdf:nodeID="Nd99359d8b38946be9050e90d512f195b">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">application/x-mobipocket-ebook</rdf:value>
          </rdf:Description>
        </dcterms:format>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:creator>
      <pgterms:agent rdf:about="2009/agents/1609">
        <pgterms:webpage rdf:resource="http://en.wikipedia.org/wiki/August_Strindberg"/>
        <pgterms:deathdate rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1912</pgterms:deathdate>
        <pgterms:birthdate rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1849</pgterms:birthdate>
        <pgterms:alias>Strindberg, Johan August</pgterms:alias>
        <pgterms:name>Strindberg, August</pgterms:name>
      </pgterms:agent>
    </dcterms:creator>
    <dcterms:publisher>Project Gutenberg</dcterms:publisher>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/ebooks/45916.txt.utf-8">
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:format>
          <rdf:Description rdf:nodeID="Nbbecde9fae7f49d3a61c4636a3f23b3f">
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">text/plain</rdf:value>
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
          </rdf:Description>
        </dcterms:format>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T22:26:13.886845</dcterms:modified>
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">644491</dcterms:extent>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/ebooks/45916.epub.images">
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">410485</dcterms:extent>
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:format>
          <rdf:Description rdf:nodeID="Nf57694627093478cb2f1b79fe569b0bb">
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">application/epub+zip</rdf:value>
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
          </rdf:Description>
        </dcterms:format>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T22:26:15.113789</dcterms:modified>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:title>Inferno Legenden</dcterms:title>
    <marcrel:trl>
      <pgterms:agent rdf:about="2009/agents/26434">
        <pgterms:birthdate rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1873</pgterms:birthdate>
        <pgterms:deathdate rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1951</pgterms:deathdate>
        <pgterms:name>Schering, Emil</pgterms:name>
      </pgterms:agent>
    </marcrel:trl>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/files/45916/45916-8.zip">
        <dcterms:format>
          <rdf:Description rdf:nodeID="Nd11587d6f2c54ed588554457e438f745">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">application/zip</rdf:value>
          </rdf:Description>
        </dcterms:format>
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">252086</dcterms:extent>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T09:02:36</dcterms:modified>
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:format>
          <rdf:Description rdf:nodeID="Nde9a69d5a10a4eac8bc341fbd6b284e2">
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">text/plain; charset=iso-8859-1</rdf:value>
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
          </rdf:Description>
        </dcterms:format>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/ebooks/45916.epub.noimages">
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:format>
          <rdf:Description rdf:nodeID="Nc8d0a845bc934efb9d272657cb764850">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">application/epub+zip</rdf:value>
          </rdf:Description>
        </dcterms:format>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T22:26:15.623745</dcterms:modified>
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">272322</dcterms:extent>
      </pgterms:file>
    </dcterms:hasFormat>
    <pgterms:downloads rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">0</pgterms:downloads>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/files/45916/45916-8.txt">
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">637384</dcterms:extent>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T09:02:34</dcterms:modified>
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:format>
          <rdf:Description rdf:nodeID="N7aa2a69d1003438ba4003eb259bd35ac">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">text/plain; charset=iso-8859-1</rdf:value>
          </rdf:Description>
        </dcterms:format>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/files/45916/45916-h/45916-h.htm">
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T09:02:36</dcterms:modified>
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">666476</dcterms:extent>
        <dcterms:format>
          <rdf:Description rdf:nodeID="N8eac5ace146f40b692be7124998929f6">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">text/html; charset=iso-8859-1</rdf:value>
          </rdf:Description>
        </dcterms:format>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/ebooks/45916.kindle.images">
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">1362365</dcterms:extent>
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T22:26:19.053536</dcterms:modified>
        <dcterms:format>
          <rdf:Description rdf:nodeID="N21c75eb3a0324793b23f0f2da05987d8">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">application/x-mobipocket-ebook</rdf:value>
          </rdf:Description>
        </dcterms:format>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:rights>Public domain in the USA.</dcterms:rights>
    <dcterms:hasFormat>
      <pgterms:file rdf:about="http://www.gutenberg.org/ebooks/45916.qioo">
        <dcterms:isFormatOf rdf:resource="ebooks/45916"/>
        <dcterms:extent rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">314173</dcterms:extent>
        <dcterms:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-06-08T22:26:14.223837</dcterms:modified>
        <dcterms:format>
          <rdf:Description rdf:nodeID="N2042f4d0e515438f86a835a107f3069f">
            <dcam:memberOf rdf:resource="http://purl.org/dc/terms/IMT"/>
            <rdf:value rdf:datatype="http://purl.org/dc/terms/IMT">application/x-qioo-ebook</rdf:value>
          </rdf:Description>
        </dcterms:format>
      </pgterms:file>
    </dcterms:hasFormat>
    <dcterms:type>
      <rdf:Description rdf:nodeID="N23936464382a478dbd492861f3ddcec0">
        <rdf:value>Text</rdf:value>
        <dcam:memberOf rdf:resource="http://purl.org/dc/terms/DCMIType"/>
      </rdf:Description>
    </dcterms:type>
    <dcterms:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2014-06-08</dcterms:issued>
    <dcterms:language>
      <rdf:Description rdf:nodeID="Ne8641b6eba6e463c8dd983956a243179">
        <rdf:value rdf:datatype="http://purl.org/dc/terms/RFC4646">de</rdf:value>
      </rdf:Description>
    </dcterms:language>
    <dcterms:license rdf:resource="license"/>
  </pgterms:ebook>
  <cc:Work rdf:about="">
    <cc:license rdf:resource="http://www.gnu.org/licenses/gpl.html"/>
  </cc:Work>
  <rdf:Description rdf:about="http://en.wikipedia.org/wiki/August_Strindberg">
    <dcterms:description>Wikipedia</dcterms:description>
  </rdf:Description>
</rdf:RDF>

需要的是从所有这些节点获取值<pgterms:name>Strindberg, August</pgterms:name>。主要的问题是:<dcterms:creator>总是改变所有的RDF文件。所以我想动态地处理它。

我的代码是这样的:

代码语言:javascript
运行
复制
$dom = simplexml_load_file('my.rdf');
$title = $dom->xpath('//rdf:RDF/pgterms:ebook/dcterms:creator/pgterms:agent/pgterms:name');
echo $title;

有什么帮助吗。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-11 11:58:19

简单地说,您不应该尝试使用XPath访问RDF。基于RDF/XML序列化的RDF图的“解决方案”非常脆弱,因为相同的RDF图可以序列化为许多不同的RDF/XML文档。它是不同的XML,但也是相同的RDF。例如,如果你坚持接受这个问题的答案,比如my answer to How to access OWL documents using XPath in Java?,这可能对你有帮助。我建议您使用专用的RDF工具。

目前,我在PHP方面无能为力,尽管似乎有一个名为EasyRDF的库可以让您对数据运行SPARQL查询。接下来我可以帮你解决SPARQL查询。RDF是一种基于图形的数据表示.基本的“事物”是三元组,它只是形式(主语、谓语、宾语)的三个元组。我们把它当作主语到宾语的有向边,用谓词标记。

RDF/XML只是它的一种表示形式。它很方便,因为有太多的XML处理工具,但是它不方便,因为它不能使三元组变得非常清楚,并且不容易以纯文本的形式阅读,也不容易手工编写。如果我们将您的数据转换为N-Triples,这是一种每行只放一个三重的格式,它看起来如下(只是其中的一部分):

代码语言:javascript
运行
复制
_:BX2D39ae9d40X3A1468ac2fcd1X3AX2D7ff9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#value> "text/plain; charset=iso-8859-1"^^<http://purl.org/dc/terms/IMT> .
_:BX2D39ae9d40X3A1468ac2fcd1X3AX2D7ff9 <http://purl.org/dc/dcam/memberOf> <http://purl.org/dc/terms/IMT> .
<http://www.gutenberg.org/2009/agents/1609> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.gutenberg.org/2009/pgterms/agent> .
<http://www.gutenberg.org/2009/agents/1609> <http://www.gutenberg.org/2009/pgterms/webpage> <http://en.wikipedia.org/wiki/August_Strindberg> .
<http://www.gutenberg.org/2009/agents/1609> <http://www.gutenberg.org/2009/pgterms/deathdate> "1912"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.gutenberg.org/2009/agents/1609> <http://www.gutenberg.org/2009/pgterms/birthdate> "1849"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://www.gutenberg.org/2009/agents/1609> <http://www.gutenberg.org/2009/pgterms/alias> "Strindberg, Johan August" .
<http://www.gutenberg.org/2009/agents/1609> <http://www.gutenberg.org/2009/pgterms/name> "Strindberg, August" .

这很容易写,但是很难读,很难看到图的结构。Turtle序列化非常好,因为它易于读和写,它使图形结构更加明显,并且非常类似于SPARQL查询语言语法。关于“海龟”中的奥古斯特·斯特林德伯格的部分是:

代码语言:javascript
运行
复制
<http://www.gutenberg.org/2009/agents/1609>
        a                  pgterms:agent ;
        pgterms:alias      "Strindberg, Johan August" ;
        pgterms:birthdate  1849 ;
        pgterms:deathdate  1912 ;
        pgterms:name       "Strindberg, August" ;
        pgterms:webpage    <http://en.wikipedia.org/wiki/August_Strindberg> .

现在,听起来您实际得到的是每个电子书中的一个RDF文件,您正在寻找有关电子书的创建者信息。下面是一个查询,它将获得文档中每个电子书的每个作者的pgterms:name属性。当然,如果您希望文件中只有一个电子书描述,您可以只选择名称(即select ?name where …)而不是select ?ebook ?name where …

代码语言:javascript
运行
复制
prefix dcterms: <http://purl.org/dc/terms/>
prefix pgterms: <http://www.gutenberg.org/2009/pgterms/>

select ?ebook ?name where {
  ?ebook a pgterms:ebook ; 
         dcterms:creator ?creator .
  ?creator pgterms:name ?name .
}
代码语言:javascript
运行
复制
------------------------------------------------------------------
| ebook                                   | name                 |
==================================================================
| <http://www.gutenberg.org/ebooks/45916> | "Strindberg, August" |
------------------------------------------------------------------

很明显,这些数据来自Gutenberg项目,在这种情况下,您可能也会发现why sparql query below do not return cartesian product很有用。它还提供了一些针对数据的SPARQL查询示例。它还讨论了数据的新的和遗留的RDF表示之间的区别,但是看起来您已经在使用新的表示,所以这并不重要。事实上,这个问题中的最后一个查询类似于这个问题,并且使用属性路径,它实际上有点像XPaths,也有点像正则表达式。可以使用属性路径简化上述查询,如下所示:

代码语言:javascript
运行
复制
prefix dcterms: <http://purl.org/dc/terms/>
prefix pgterms: <http://www.gutenberg.org/2009/pgterms/>

select ?ebook ?name where {
  ?ebook a pgterms:ebook ; 
         dcterms:creator/pgterms:name ?name .
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24158266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档