как извлечь тему (имя) по сравнению с предикатом из RDF Triple с помощью sparql

http://www.example.com/teach.rdfs/John   http://www.example.com/teach.rdfs#position "Full Professor"        

http://www.example.com/teach.rdfs/John   http://www.example.com/teach.rdfs#course"Math"

http://www.example.com/teach.rdfs/John   http://www.example.com/teach.rdfs#student"Undergraduate"

http://www.example.com/teach.rdfs/Arthur http://www.example.com/teach.rdfs#position "Assistant Professor"

http://www.example.com/teach.rdfs/Arthur http://www.example.com/teach.rdfs#course"Web Engineering"

http://www.example.com/teach.rdfs/Arthur http://www.example.com/teach.rdfs#student"Graduate"

ЕСЛИ это тройки, и я хочу найти доцентов, которые преподают в аспирантуре

 Lecturer       Position

 Arthur         Assistant Professor 

как можно извлечь указанную выше дату с помощью SPARQL


person A. Rehman Javed    schedule 20.06.2013    source источник


Ответы (1)


Ваши данные не находятся в какой-либо законной сериализации RDF, о которой я знаю, но довольно легко получить их в сериализации N3. Довольно необычно видеть, что http://.../teach.rdfs# и http://.../teach.rdfs/ используются в качестве префиксов в одном и том же документе. Обычно можно увидеть одно или другое, но не то и другое одновременно. Однако это не незаконно, поэтому мы можем с этим работать. В формате N3 это ваши данные в виде файла data.n3:

@prefix teach1: <http://www.example.com/teach.rdfs/> .
@prefix teach2: <http://www.example.com/teach.rdfs#> .

teach1:John teach2:position "Full Professor" .
teach1:John teach2:course "Math" .
teach1:John teach2:student "Undergraduate" .
teach1:Arthur teach2:position "Assistant Professor" .
teach1:Arthur teach2:course "Web Engineering" .
teach1:Arthur teach2:student "Graduate" .

Запрос тоже довольно простой. Вот как, как файл с именем query.sparql:

PREFIX teach1: <http://www.example.com/teach.rdfs/>
PREFIX teach2: <http://www.example.com/teach.rdfs#>

SELECT ?lecturer ?position WHERE {
  VALUES ?position { "Assistant Professor" }
  ?lecturer teach2:position ?position ;
            teach2:student "Graduate" .
}

Единственное, что немного необычно в этом запросе, - это использование VALUES ?position { "Assistant Professor" }. Причина, по которой я использовал форму VALUES, заключается в том, что желаемые результаты включали "Assistant Professor" на выходе. Если мы исключим часть VALUES ..., мы можем переписать шаблон как

  ?lecturer teach2:position "Assistant Professor" ;
            teach2:student "Graduate" .

и по-прежнему находите те же ?lecturers, но нет переменной, привязанной к "Assistant Professor". Имея под рукой данные и запрос, мы можем выполнить запрос к данным с помощью инструментов командной строки Jena ARQ:

$ arq --query query.sparql --data data.n3 
-----------------------------------------
| lecturer      | position              |
=========================================
| teach1:Arthur | "Assistant Professor" |
-----------------------------------------
person Joshua Taylor    schedule 20.06.2013