使用 Raptor RDF Parser Toolkit 生成 FOAF rdfxml 文件
Using Raptor RDF Parser Toolkit to generate a FOAF rdfxml file
我想使用 Raptor RDF Parser Toolkit to generate the following output (checked with RDF Validator):
编写一个 C/C++ 程序
<?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>
数据模型的三元组如下所示:
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
仅作记录,我使用 Visual Studio 2017 x64。
我想出了以下代码:
#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);
}
生成的文件如下所示:
<?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>
我在这里做错了什么?我想产生与上图相同的结果。创建 <rdf:Description>
标签而不是 <foaf:Person>
标签。
Turtle 输出 (raptor_new_serializer(world, "turtle")
) 如下所示:
@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" .
你的代码存在三个问题。
你混淆了不同种类的 RDF terms:
- URI 和文字(第 20、42 行),
- URI 和空白节点(第 18、29、40 行)。
为了输出typed nodes,你应该使用rdfxml-abbrev
序列化(第7行)。
您混淆了哪些事物以何种方式连接(第 29、40 行):
你需要构建这个结构:
相反,您正在构建这样的东西:
此代码运行良好:
#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;
}
输出为:
<?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>
我想使用 Raptor RDF Parser Toolkit to generate the following output (checked with RDF Validator):
编写一个 C/C++ 程序<?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>
数据模型的三元组如下所示:
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
仅作记录,我使用 Visual Studio 2017 x64。 我想出了以下代码:
#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);
}
生成的文件如下所示:
<?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>
我在这里做错了什么?我想产生与上图相同的结果。创建 <rdf:Description>
标签而不是 <foaf:Person>
标签。
Turtle 输出 (raptor_new_serializer(world, "turtle")
) 如下所示:
@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" .
你的代码存在三个问题。
你混淆了不同种类的 RDF terms:
- URI 和文字(第 20、42 行),
- URI 和空白节点(第 18、29、40 行)。
为了输出typed nodes,你应该使用
rdfxml-abbrev
序列化(第7行)。您混淆了哪些事物以何种方式连接(第 29、40 行):
你需要构建这个结构:
相反,您正在构建这样的东西:
此代码运行良好:
#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;
}
输出为:
<?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>