#sparql #rdf
#sparql #rdf
Вопрос:
Учитывая следующие тройки
@prefix ex: lt;http://example.org/gt; .@base lt;http://example.com/gt; .lt;person1gt; ex:has_interpretation lt;interpretation1gt; .lt;interpretation1gt; ex:refers_to lt;objectAgt; ; ex:resultIn lt;Xgt; .lt;person2gt; ex:has_interpretation lt;interpretation2gt; .lt;interpretation2gt; ex:refers_to lt;objectAgt; ; ex:resultIn lt;Ygt; .lt;person2gt; ex:has_interpretation lt;interpretation3gt; .lt;interpretation3gt; ex:refers_to lt;objectBgt; ; ex:resultIn lt;Zgt; .lt;person3gt; ex:has_interpretation lt;interpretation4gt; .lt;interpretation3gt; ex:refers_to lt;objectAgt; ; ex:resultIn lt;ZZgt; .
Я пытаюсь использовать SPARQL для:
- подсчитайте только количество объектов, на которые ссылается интерпретация как person1, так и person2 (пересечение)
- подсчитайте количество различных интерпретаций объекта
- подсчитайте количество объектов, на которые не ссылается интерпретация как персоной 1, так и персоной 2
- наличие вышеуказанного подсчета вместе со списком объектов, на которые ссылается интерпретация, и людей, которые создают интерпретацию.
У меня возникли проблемы конкретно с 1 (и, следовательно, с 3), так как я не могу найти способ подсчитать пересечение интерпретируемых объектов.
Мой текущий запрос SPARQL, который не получает то, что я хочу:
PREFIX ex: lt;http://example.org/gt;SELECT ?person (COUNT(distinct ?object) as ?c_object) (group_concat(distinct ?interpretation;separator="; ") as ?interpretations)WHERE { ?person ex:has_interpretation ?interpretation . ?interpretation ex:refers_to ?object ; ex:resultIn ?result .FILTER (?person = lt;http://example.com/person1gt; || ?person = lt;http://example.com/person2gt; ) }GROUP BY ?person ?object
Что вместо этого я бы хотел, так это просто:
объект_ури | number_object | интерпретации | вовлеченный человек |
---|---|---|---|
lt;objectAgt; |
1 | lt;interpretation1gt;,lt;interpretation2gt; |
lt;person1gt;,lt;person2gt; |
Есть какие-нибудь идеи?
Комментарии:
1. почему вы группируетесь по
?person
, если вам нужен список людей для каждого объекта? Кроме того,number_object
в каком именно случае значение больше 1?
Ответ №1:
- подсчитайте только количество объектов, на которые ссылается интерпретация как person1, так и person2 (пересечение)
PREFIX ex: lt;http://example.org/gt; SELECT DISTINCT ?objWHERE { lt;http://example.com/person1gt; ex:has_interpretation/ex:refers_to ?obj . lt;http://example.com/person2gt; ex:has_interpretation/ex:refers_to ?obj .}
Здесь запрос соответствует только тем объектам ( ?obj
), которые имеют ex:has_interpretation/ex:refers_to
пути к ним из обоих lt;person1gt;
и lt;person2gt;
.
- подсчитайте количество различных интерпретаций объекта
Просто используйте COUNT()
функцию в качестве путей, используемых в ответе на 1. Выше указаны разные (разные):
PREFIX ex: lt;http://example.org/gt; SELECT DISTINCT ?objWHERE { lt;http://example.com/person1gt; ex:has_interpretation/ex:refers_to ?obj . lt;http://example.com/person2gt; ex:has_interpretation/ex:refers_to ?obj .}
- подсчитайте количество объектов, на которые не ссылается интерпретация как персоной 1, так и персоной 2
Возможно, вы сможете найти необычный способ запроса для этого, но я бы просто посчитал отдельные объекты:
PREFIX ex: lt;http://example.org/gt;SELECT DISTINCT ?objWHERE { ?x ex:refers_to ?obj .}
…а затем вычтите результаты из 1. выше. Это легко понять, и у вас уже есть результаты 1. с которыми нужно работать.