rdflib не анализирует файл RDF / XML

#python #rdf #semantic-web #rdflib #foaf

#python #rdf #семантический веб #rdflib #foaf

Вопрос:

Я пытаюсь загрузить и проанализировать очень простой файл rdf в формате xml, используя rdflib. Я не думаю, что он анализирует правильно. Вот мой файл rdf / xml,

 <rdf:RDF xmlns:rdf="http://w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:foaf="http://xmlns.com/foaf/0.1/"
>

  <foaf:Person>
    <foaf:name>Peter Parker</foaf:name>
  </foaf:Person>

</rdf:RDF>
 

Мой скрипт на python здесь,

 from rdflib import Graph

g = Graph()
g.parse("person_1.rdf", format="xml")

print(len(g))

print(g.serialize(format="xml").decode("u8"))

print("Test - 2")
 

И вот вывод программы,

 3
<?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:nodeID="Nababb97ad88341329a7cf22cec65c00c">
    <rdf:type rdf:resource="http://w3.org/1999/02/22-rdf-syntax-ns#RDF"/>
    <foaf:Person rdf:nodeID="Nfa7b9ab24fae4bcd9ffbaa13aeb733db"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="Nfa7b9ab24fae4bcd9ffbaa13aeb733db">
    <rdf:type rdf:resource="http://xmlns.com/foaf/0.1/name"/>
  </rdf:Description>
</rdf:RDF>

Test - 2
 

Я не вижу имени «Питер Паркер» в выходных данных. Я делаю что-то не так.
Заранее спасибо.

Комментарии:

1. Я не эксперт по rdflib, но нет импорта foaf и нет объявления для foaf:Person и foaf:name, поэтому анализатор будет сбит с толку их использованием. Это объяснило бы результаты.

2. @Ignazio речь идет не об импорте, это не OWL, а обычный RDF

3. короче говоря, это просто недопустимый RDF / XML — он больше похож на используемый обычный XML с некоторыми префиксами. Пожалуйста, сравните со спецификациями синтаксиса RDF / XML: w3.org/TR/rdf-syntax-grammar — вы должны увидеть какую-то очевидную разницу

Ответ №1:

Вам нужно будет окружить документ атрибутами документа foafpersonal profile, как показано ниже

 <foaf:PersonalProfileDocument>
  <foaf:Person>
    <foaf:family_name>Peter Parker</foaf:family_name>
  </foaf:Person>
</foaf:PersonalProfileDocument>
</rdf:RDF>
 

затем импортируйте пространство имен foaf, как показано ниже

 from rdflib.namespace import FOAF , XSD
 

Ответ №2:

Если вы просто хотите получить данные, попробуйте следующий метод.

 from simplified_scrapy import utils, SimplifiedDoc, req
xml = '''
<rdf:RDF xmlns:rdf="http://w3.org/1999/02/22-rdf-syntax-ns#" 
         xmlns:foaf="http://xmlns.com/foaf/0.1/"
>

  <foaf:Person>
    <foaf:name>Peter Parker</foaf:name>
  </foaf:Person>

</rdf:RDF>
'''
# xml = utils.getFileContent('person_1.rdf')
doc = SimplifiedDoc(xml)
print(doc.select('foaf:Person>foaf:name>text()'))
# Or
print(doc.select('foaf:name>text()'))
# Or
print(doc.select('foaf:name'))
 

Результат:

 Peter Parker
Peter Parker
{'tag': 'foaf:name', 'html': 'Peter Parker'}
 

Комментарии:

1. Привет, Язз, спасибо за ваше решение. Но это решение использует модуль, отличный от rdflib. Я пытаюсь изучить использование rdflib. Интересно, почему rdflib работает не так, как ожидалось.

2. @LaeeqKhan Извините, я тоже не понимаю rdflib. Удачи.

Ответ №3:

Я не вижу никаких проблем при разборе этого RDF — это допустимый RDF — но причина, по которой вы не видите хороших результатов при повторной сериализации, заключается в том, что это ужасный RDF, который не имеет смысла! Вам нужно идентифицировать узел person. Если вы знаете, что URI Питера Паркера http://example.com/person/pp тогда вы можете использовать:

 <?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 rdf:about="http://example.com/person/pp">
    <foaf:name>Peter Parker</foaf:name>
  </foaf:Person>
</rdf:RDF>
 

Если вы не знаете URI Питера Паркера, вы можете использовать пустой узел:

 <?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 rdf:nodeID="ub2bL2C1">
    <foaf:name>Peter Parker</foaf:name>
  </foaf:Person>
</rdf:RDF>
 

Но RDF — это все для идентификации вещей, поэтому лучше назначить URI человеку.