как искать объект rdf, зная предмет или наоборот? - PullRequest
4 голосов
/ 02 марта 2011

Я использую RDFLIB для построения графиков среди 3 наборов данных (A, B, C) с n-триплетами.

Цель: графики содержат ссылки между этими наборами данных A-> B, B->C и C-> A, я хочу проверить согласованность этих ссылок, убедившись, что исходящие из A ссылки ссылаются на те же записи в A.

Проблема: однажды я перебираю ссылки в A->B, я хотел найти соответствующие записи (может быть больше одной) в B-> C и то же самое для C-> A, есть ли способ поиска объектов, зная предмет, не повторяя все записи

1 Ответ

5 голосов
/ 02 марта 2011

есть ли способ поиска объектов, зная предмет без перебора всех записей?

Ответ - Да. И вы можете использовать для различных механизмов: (а) итерации с ограничением; или (b) выполнить запрос SPARQL.

(a) ограничить график и повторить

В этом решении используется функция RDFLib triples над объектом Graph. См. эту ссылку .

#Parse the file
g = rdflib.Graph()
g.parse("yourdata.nquads")
subject = article = rdflib.term.URIRef("http://www.someuri.org/for/your/subject")

# (subject,None,None) represents a constrain to iterate over the graph. By setting
# any of the three elements in the triple you constrain by any combination of subject,
# predicate or object. In this case we only  constrain by subject.
for triple in g.triples((subject,None,None)):
    print triple

(b) выполнить запрос SPARQL

Более стандартное решение с использованием стандарта SPARQL .

rdflib.plugin.register('sparql', rdflib.query.Processor,
                       'rdfextras.sparql.processor', 'Processor')
rdflib.plugin.register('sparql', rdflib.query.Result,
                       'rdfextras.sparql.query', 'SPARQLQueryResult')

 #Parse the file
g = rdflib.Graph()
g.parse("yourdata.nquads")

query = """
    SELECT ?pred ?obj WHERE {
         <http://www.someuri.org/for/your/subject> ?pred ?obj
    }
    """
for row in g.query(query):
    print "Predicate:%s Object:%s"%(row[0],row[1])
...