RDF::Redland:: Модель, как добавить тег <foaf:: nick>
Я загрузил RDF::Redland::Model
проанализирован из документа RDF/XML и я хочу добавить тег <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;
и это не работает. Что я делаю неправильно?
1 ответ
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]]
Добавьте новый оператор в модель, содержащую объект типизированной литеральной строки STRING с (необязательно) языком XML (атрибут xml:lang) XML_LANGUAGE и (необязательно) типом данных URI DATATYPE. XML_LANGUAGE или DATATYPE могут быть установлены на undef или оба.
В первом случае кажется, что вам нужно создать RDF:: Redland:: Node для представления буквенной строки, которая является псевдонимом. Существует конструктор, который принимает строковый аргумент. Во втором случае, который, вероятно, проще, вы можете просто использовать строку напрямую.
редактировать
Теперь, когда вы опубликовали свой код, конкретная проблема проясняется, хотя вы все еще не упомянули, что на самом деле идет не так.
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, с которым вы также работаете. Однако, как я уже указывал в этом ответе, смысл RDF API - позволить вам работать с утверждениями графа RDF и не беспокоиться о конкретной сериализации графа.
Похоже, вы хотите добавить заявление
$something foaf:nick "content"
на график, для некоторого предмета, который вы не определили. Согласно документации, на которую я ссылался и цитировал выше, add_typed_literal_statement
принимает три аргумента, а не один, а третий аргумент должен быть строкой. Ваша вторая строка должна выглядеть примерно так:
$self->{Model}->add_typed_literal_statement($subject,$foafNick,"content");
где $subject
а также $foafNick
являются узлами URI. Например, вы можете сделать это (не проверено):
$subject = new RDF::Redland::URINode("https://stackru.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://stackru.com/users/400371> foaf:nick "Nikita"
к модели.