У меня есть данные RDF/XML, которые я хотел бы проанализировать и получить доступ к узлу. Это выглядит следующим образом:Доступ к узлам файлов RDF/XML/OWL с использованием Perl
<!-- http://purl.obolibrary.org/obo/VO_0000185 -->
<owl:Class rdf:about="&obo;VO_0000185">
<rdfs:label>Influenza virus gene</rdfs:label>
<rdfs:subClassOf rdf:resource="&obo;VO_0000156"/>
<obo:IAO_0000117>YH</obo:IAO_0000117>
</owl:Class>
<!-- http://purl.obolibrary.org/obo/VO_0000186 -->
<owl:Class rdf:about="&obo;VO_0000186">
<rdfs:label>RNA vaccine</rdfs:label>
<owl:equivalentClass>
<owl:Class>
<owl:intersectionOf rdf:parseType="Collection">
<rdf:Description rdf:about="&obo;VO_0000001"/>
<owl:Restriction>
<owl:onProperty rdf:resource="&obo;BFO_0000161"/>
<owl:someValuesFrom rdf:resource="&obo;VO_0000728"/>
</owl:Restriction>
</owl:intersectionOf>
</owl:Class>
</owl:equivalentClass>
<rdfs:subClassOf rdf:resource="&obo;VO_0000001"/>
<obo:IAO_0000116>Using RNA may eliminate the problem of having to tailor a vaccine for each individual patient with their specific immunity. The advantage of RNA is that it can be used for all immunity types and can be taken from a single cell. DNA vaccines need to produce RNA which then prompts the manufacture of proteins. However, RNA vaccine eliminates the step from DNA to RNA.</obo:IAO_0000116>
<obo:IAO_0000115>A vaccine that uses RNA(s) derived from a pathogen organism.</obo:IAO_0000115>
<obo:IAO_0000117>YH</obo:IAO_0000117>
</owl:Class>
Полный RDF/XML файл можно найти here.
То, что я хочу сделать, это сделать следующее:
- Find кусок, где содержится запись
<rdfs:subClassOf rdf:resource="&obo;VO_0000001"/>
- Доступ буквальный термин, как это определено
<rdfs:label>...</rdfs:label>
Таким образом, в выше Например, код будет проходить второй кусок и вывод: «РНК-вакцина».
В настоящее время я придерживаюсь следующего кода. Где я не мог получить доступ к узлу. Каков правильный способ сделать это? Приветствуются решения, отличные от использования XML :: LibXML .
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Carp;
use File::Basename;
use XML::LibXML 1.70;
my $filename = "VO.owl";
# Obtained from http://svn.code.sf.net/p/vaccineontology/code/trunk/src/ontology/VO.owl
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($filename);
foreach my $chunk ($doc->findnodes('/owl:Class')) {
my ($label) = $chunk->findnodes('./rdfs:label');
my ($subclass) = $chunk->findnodes('./rdfs:subClassOf');
print $label->to_literal;
print $subclass->to_literal;
}
Я бы упомянул, что не только приветствуются решения, не использующие библиотеки XML, а _preferred_; [не пытайтесь разобрать RDF как XML] (http://stackoverflow.com/a/17052385/1281433). Это правда, что RDF может быть сериализован в XML, но один и тот же график RDF может быть сериализован в XML в нескольких разных вариантах_, а решение XML, которое работает на одном, вряд ли будет работать на другом. RDF является представлением _graph-based_ и должно рассматриваться как таковое. –