【问题标题】:RDF::Redland::Model how to add tag <foaf::nick> [closed]RDF::Redland::Model 如何添加标签 <foaf::nick> [关闭]
【发布时间】:2013-08-26 14:55:50
【问题描述】:

我加载了一个从 RDF/XML 文档解析的 RDF::Redland::Model,我想在其中添加标签 &lt;foaf::nick&gt;。我该怎么做?

更新:

这是我目前的代码:

my $st = RDF::Redland::Node->new_xml_literal("<foaf:nick>content</foaf:content>");
$self->{Model}->add_typed_literal_statement($st);
print $self->{Model}->to_string; 

它不起作用。我做错了什么?

【问题讨论】:

  • 结束问题的原因包括:“有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括重现问题的有效代码。有关指导,请参阅 SSCCE.org, ”和“要求代码的问题必须证明对正在解决的问题的最低限度的理解。包括尝试的解决方案、为什么它们不起作用以及预期的结果。”你试过什么了?你用过RDF::Redland::Model中的哪些方法?什么不起作用?
  • 感谢您更新问题以显示代码,但是“这不起作用”是什么意思?代码是否导致错误?它运行没有问题,但打印的结果与您的预期不同?究竟是什么失败了?
  • 请用四个前导空格标记问题中的代码块。您可以阅读Markdown help。我刚刚修复了您的代码以使用此约定,因为您使用了块引用(以 &gt; 开头的行),这使 &lt;foaf:nick&gt;...&lt;/foaf:content&gt; 不会出现。
  • 定义“不起作用”。

标签: perl rdf redland


【解决方案1】:

RDF 模型不包含标签(甚至是 XML 元素); RDF 模型是一组subject predicate object 形式的三元组。 foaf:nick 是一个将foaf:Person 与昵称相关联的属性。根据您问题的标题,听起来您想要做的是在模型中添加一个三元组something foaf:nick somenick。在这种情况下,RDF::Redland::Model 的文档表明您需要的是 addadd_typed_literal_statement

添加主语谓词宾语

在模型中添加一条新语句 主语、谓语和宾语。这些可以是 RDF::Redland::Node, RDF::Redland::URI 或 perl URI 对象。

add_typed_literal_statement SUBJECT PREDICATE STRING [XML_LANGUAGE [DATATYPE]]

向包含类型化的模型添加新语句 带有(可选)XML 语言 (xml:lang) 的文字字符串对象 STRING 属性)XML_LANGUAGE 和(可选)数据类型 URI DATATYPE。 XML_LANGUAGE 或 DATATYPE 可以设置为 undef,也可以同时设置为 undef。

在第一种情况下,您似乎需要创建一个RDF::Redland::Node 来表示作为昵称的文字字符串。有a constructor 接受字符串参数。第二种情况可能更简单,你可以直接使用字符串。

编辑

现在您已经发布了代码,具体问题变得更加清晰,尽管您仍然没有提到实际出了什么问题。

my $st = RDF::Redland::Node->new_xml_literal("<foaf:nick>content</foaf:content>");
$self->{Model}->add_typed_literal_statement($st);

首先,如果我理解您要执行的操作,您使用的 XML 内容格式不正确,因为开始和结束标记不匹配(nick 不是 content) .更成问题的是,这不是 RDF 的工作方式。 RDF 是一种面向图的表示,其中基本概念是一种形式的陈述

subject predicate object

RDF 图或模型是这些的集合。将每个语句视为从主体到对象的有向标记边,我们获得了一个图。 RDF 模型可以以多种格式进行序列化,其中一种是RDF/XML,这也是您正在使用的一种。然而,正如我在this answer 中指出的那样,RDF API 的意义在于让您使用 RDF 图的语句,而不用关心图的特定序列化。

听起来你想添加一个语句

$something foaf:nick "content"

对于您尚未确定的某些主题,请参见图表。根据我在上面链接和引用的文档,add_typed_literal_statement 接受 三个 参数,而不是一个,第三个参数应该是一个字符串。您的第二行应该类似于:

$self->{Model}->add_typed_literal_statement($subject,$foafNick,"content");

其中$subject$foafNick 是URI Nodes。例如,您可以这样做(未经测试):

$subject = new RDF::Redland::URINode("https://stackoverflow.com/users/400371");
$foafNick = new RDF::Redland::URINode("http://xmlns.com/foaf/0.1/nick");
$self->{Model}->add_typed_literal_statement($subject,$foafNick,"Nikita");

添加三元组

<https://stackoverflow.com/users/400371> foaf:nick "Nikita"

到模型。

【讨论】:

  • 好的,我已经更新了我的问题
猜你喜欢
  • 1970-01-01
  • 2013-07-27
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多