首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Raptor RDF Parser Toolkit生成FOAF rdfxml文件

使用Raptor RDF Parser Toolkit生成FOAF rdfxml文件
EN

Stack Overflow用户
提问于 2018-01-22 17:25:34
回答 1查看 289关注 0票数 2

我想用Raptor RDF Parser工具包编写一个C/C++程序来生成以下输出(用RDF校验器检查):

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
          xmlns:foaf="http://xmlns.com/foaf/0.1/">

   <foaf:Person xml:lang="en">
     <foaf:name>Jimmy Wales</foaf:name>
     <foaf:mbox rdf:resource="mailto:jwales@bomis.com"/>
     <foaf:nick>Jimbo</foaf:nick>
     <!-- photo -->
     <foaf:depiction
       rdf:resource="http://upload.wikimedia.org/wikipedia/commons/1/19/Jimbo_Wales_in_France_cropped.jpg" />
   </foaf:Person>

 </rdf:RDF>

数据模型的三元组如下所示:

代码语言:javascript
复制
Number  Subject Predicate   Object
1   genid:A4486 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
2   genid:A4486 http://xmlns.com/foaf/0.1/name  "Jimmy Wales"@en
3   genid:A4486 http://xmlns.com/foaf/0.1/mbox  mailto:jwales@bomis.com
4   genid:A4486 http://xmlns.com/foaf/0.1/nick  "Jimbo"@en
5   genid:A4486 http://xmlns.com/foaf/0.1/depiction http://upload.wikimedia.org/wikipedia/commons/1/19/Jimbo_Wales_in_France_cropped.jpg

为了记录起见,我正在使用2017 x64。我想出了以下代码:

代码语言:javascript
复制
#include "raptor2/raptor2.h"

int main(int argc, char* argv[]) {
    FILE* outfile = fopen("myTestfile.rdf", "w");

    raptor_world* world = raptor_new_world();
    rdf_serializer = raptor_new_serializer(world, "rdfxml" /* "turtle" */);
    raptor_serializer_start_to_file_handle(rdf_serializer, nullptr, outfile);

    const unsigned char* prefix = (const unsigned char*)"foaf";
    raptor_uri* uri = raptor_new_uri(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/");
    raptor_serializer_set_namespace(rdf_serializer, uri, prefix);

    {
        raptor_statement* triple = nullptr;
        triple = raptor_new_statement(world);

        triple->subject = raptor_new_term_from_uri_string(world, (const unsigned char*)"genid:A4486");
        triple->predicate = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
        triple->object = raptor_new_term_from_literal(world, (unsigned char*)"http://xmlns.com/foaf/0.1/Person", nullptr, nullptr);
        raptor_serializer_serialize_statement(rdf_serializer, triple);
        raptor_free_statement(triple);
    }

    {
        raptor_statement* triple = nullptr;
        triple = raptor_new_statement(world);

        triple->subject = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/Person");
        triple->predicate = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/name");
        triple->object = raptor_new_term_from_literal(world, (unsigned char*)"Jimmy Wales", nullptr, nullptr);
        raptor_serializer_serialize_statement(rdf_serializer, triple);
        raptor_free_statement(triple);
    }

    {
        raptor_statement* triple = nullptr;
        triple = raptor_new_statement(world);

        triple->subject = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/Person");
        triple->predicate = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/mbox");
        triple->object = raptor_new_term_from_literal(world, (unsigned char*)"mailto:jwales@bomis.com", nullptr, nullptr);
        raptor_serializer_serialize_statement(rdf_serializer, triple);
        raptor_free_statement(triple);
    }

    raptor_serializer_serialize_end(rdf_serializer);
    raptor_free_serializer(rdf_serializer);
    raptor_free_world(world);

    fclose(outfile);
}

生成的文件如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about="genid:A4486">
    <rdf:type>http://xmlns.com/foaf/0.1/Person</rdf:type>
  </rdf:Description>
  <rdf:Description rdf:about="http://xmlns.com/foaf/0.1/Person">
    <foaf:name>Jimmy Wales</foaf:name>
  </rdf:Description>
  <rdf:Description rdf:about="http://xmlns.com/foaf/0.1/Person">
    <foaf:mbox>mailto:jwales@bomis.com</foaf:mbox>
  </rdf:Description>
</rdf:RDF>

我在这里做错什么了?我希望产生与上面所示的结果相同的结果。而不是创建<foaf:Person>标记,而是创建<rdf:Description>标记。

海龟输出(raptor_new_serializer(world, "turtle"))如下所示:

代码语言:javascript
复制
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<genid:A4486>
    a "http://xmlns.com/foaf/0.1/Person" .

foaf:Person
    foaf:mbox "mailto:jwales@bomis.com" ;
    foaf:name "Jimmy Wales" .
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-28 20:12:11

代码中有三个问题。

  1. 你把不同种类的RDF项混在一起
代码语言:javascript
复制
- URIs and literals (lines 20, 42),
- URIs and blank nodes (lines 18, 29, 40).

  1. 为了输出类型化节点,您应该使用rdfxml-abbrev序列化(第7行)。
  2. 您混淆了哪些事物是以何种方式连接的(第29、40行):
代码语言:javascript
复制
- You need to construct this structure:

代码语言:javascript
复制
- Instead, you're constructing something like this:

此代码运行良好:

代码语言:javascript
复制
#include <stdio.h>
#include <raptor/raptor2.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
  raptor_world *world = NULL;
  raptor_serializer* rdf_serializer = NULL;
  unsigned char *uri_string;
  raptor_uri *base_uri;
  raptor_statement* triple;

  world = raptor_new_world();

  uri_string = raptor_uri_filename_to_uri_string(argv[1]);
  base_uri = raptor_new_uri(world, uri_string);

  rdf_serializer = raptor_new_serializer(world, "rdfxml-abbrev");
  raptor_serializer_start_to_file_handle(rdf_serializer, base_uri, stdout);

  const unsigned char* foaf_prefix = (const unsigned char*)"foaf";
  raptor_uri* foaf_uri = raptor_new_uri(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/");
  raptor_serializer_set_namespace(rdf_serializer, foaf_uri, foaf_prefix);

  const unsigned char* rdf_prefix = (const unsigned char*)"rdf";
  raptor_uri* rdf_uri = raptor_new_uri(world, (const unsigned char*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#");
  raptor_serializer_set_namespace(rdf_serializer, rdf_uri, rdf_prefix);

  {
    raptor_statement* triple = NULL; triple = raptor_new_statement(world);

    triple->subject = raptor_new_term_from_blank(world, (const unsigned char*)"b1");
    triple->predicate = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/name");
    triple->object = raptor_new_term_from_literal(world, (unsigned char*)"Jimmy Wales", NULL, NULL);

    raptor_serializer_serialize_statement(rdf_serializer, triple); raptor_free_statement(triple);
  }

  {
    raptor_statement* triple = NULL; triple = raptor_new_statement(world);

    triple->subject = raptor_new_term_from_blank(world, (const unsigned char*)"b1");  
    triple->predicate = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://xmlns.com/foaf/0.1/mbox");
    triple->object = raptor_new_term_from_uri_string(world, (unsigned char*)"mailto:jwales@bomis.com");

    raptor_serializer_serialize_statement(rdf_serializer, triple); raptor_free_statement(triple);
  }

  {
    raptor_statement* triple = NULL; triple = raptor_new_statement(world);

    triple->subject = raptor_new_term_from_blank (world, (const unsigned char*)"b1");  
    triple->predicate = raptor_new_term_from_uri_string(world, (const unsigned char*)"http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
    triple->object = raptor_new_term_from_uri_string(world, (unsigned char*)"http://xmlns.com/foaf/0.1/Person");

    raptor_serializer_serialize_statement(rdf_serializer, triple); raptor_free_statement(triple);
  }

  raptor_serializer_serialize_end(rdf_serializer);
  raptor_free_serializer(rdf_serializer);
  raptor_free_uri(base_uri);
  raptor_free_memory(uri_string);
  raptor_free_world(world);
  return 0;
}

产出如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <foaf:Person>
    <foaf:mbox rdf:resource="mailto:jwales@bomis.com"/>
    <foaf:name>Jimmy Wales</foaf:name>
  </foaf:Person>
</rdf:RDF>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48387060

复制
相关文章

相似问题

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