#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 человеку.