Получение результатов dbpedia с дополнительными свойствами

Я создаю приложение, которое показывает информацию об объектах данного текста. Я использую библиотеку sparqlwrapper для Python для запросов к DBpedia. Я использую следующий код, когда получаю объект Person:

def get_person_data(einfo):
    data = {}
    try:
        uri = einfo['disambiguated']['dbpedia']

        sparql = SPARQLWrapper("http://dbpedia.org/sparql")
        query = u"""
        SELECT ?birthDate, ?birthName, ?birthPlace
        WHERE { <%s>
                dbpprop:birthDate ?birthDate ;
                dbpprop:birthName ?birthName ;
                dbpprop:birthPlace ?birthPlace
        }
        """ % uri
        sparql.setQuery(query)
        sparql.setReturnFormat(JSON)
        results = sparql.query().convert()

Проблема с этим кодом заключается в том, что если поле отсутствует на странице DBpedia, результаты ничего не возвращают. Трудно узнать, какие свойства присутствуют во всех объектах данного типа, поэтому я хотел бы определить некоторые желаемые свойства, а затем получить имеющиеся. Я попытался запросить что-то вроде:

SELECT * WHERE {
  ?x rdfs:label "New York"@en.
  ?x dbpedia-owl:abstract ?abstract.
  OPTIONAL { 
  ?x dbpedia-owl:areaTotal ?areaTotal.
  ?x dbpprop:governor ?governor.
  ?x dbpprop:birthPlace ?birthPlace.
  }
  FILTER (LANG(?abstract) = 'en')
}

В этом случае у Нью-Йорка нет birthPlace, поэтому я получаю только информацию abstract. Я тоже хочу получить areaTotal и governor.


person Rod0n    schedule 12.08.2013    source источник


Ответы (1)


Необязательный блок весь либо совпадает, либо нет. Если вы хотите дополнительно сопоставить несколько разных вещей, вам потребуется несколько необязательных блоков, как в

SELECT * WHERE {
  ?x rdfs:label "New York"@en.
  ?x dbpedia-owl:abstract ?abstract.
  OPTIONAL { ?x dbpedia-owl:areaTotal ?areaTotal. }
  OPTIONAL { ?x dbpprop:governor ?governor. }
  OPTIONAL { ?x dbpprop:birthPlace ?birthPlace. }
  FILTER (LANG(?abstract) = 'en')
}

результаты SPARQL

person Joshua Taylor    schedule 12.08.2013