我有一个从RDF / XML文档解析的RDF::Redland::Model
加载,我想在其中添加标记<foaf::nick>
。我该怎么办?
到目前为止,这是我的代码:
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;
它不起作用。我做错了什么?
答案 0 :(得分:4)
RDF模型不包含标签(甚至是XML元素); RDF模型是subject predicate object
形式的一组三元组。 foaf:nick是将foaf:Person与昵称相关联的属性。根据您问题的标题,听起来您想要做的是为模型添加三something foaf:nick somenick
。在这种情况下,RDF::Redland::Model的文档表明您想要的是add
或add_typed_literal_statement
:
添加SUBJECT PREDICATE OBJECT
使用添加新语句到模型 主题,预测和对象。这些可以是RDF :: Redland :: Node, RDF :: Redland :: URI或perl URI对象。
add_typed_literal_statement SUBJECT PREDICATE STRING [XML_LANGUAGE [DATATYPE]]
向包含类型的模型添加新语句 带有(可选)XML语言的文字字符串对象STRING(xml:lang 属性)XML_LANGUAGE和(可选)数据类型URI DATATYPE。 XML_LANGUAGE或DATATYPE可以或两者都设置为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
不是{{ 1}})。更有问题的是,这不是RDF的工作方式。 RDF是一个面向图形的表示,其中基本概念是表单的声明
content
和RDF图或模型是这些中的一组。将每个语句视为从主体到对象的定向标记边缘,我们获得一个图形。 RDF模型可以以多种格式序列化,其中一种格式为RDF/XML,这也是您正在使用的格式。但是,正如我在this answer中指出的那样,RDF API的目的是让您使用RDF图的语句,而不关心图的特定序列化。
听起来你想要添加一个声明
subject predicate object
到图表中,对于某些您尚未识别的主题。根据我上面链接和引用的文档,$something foaf:nick "content"
需要三个参数,而不是一个,第三个参数应该是一个字符串。你的第二行应该是这样的:
add_typed_literal_statement
其中$self->{Model}->add_typed_literal_statement($subject,$foafNick,"content");
和$subject
是URI Nodes。例如,您可以这样做(未经测试):
$foafNick
添加三联
$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");
到模特。