Элемент подсчета SPARQL в пересечении

#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 для:

  1. подсчитайте только количество объектов, на которые ссылается интерпретация как person1, так и person2 (пересечение)
  2. подсчитайте количество различных интерпретаций объекта
  3. подсчитайте количество объектов, на которые не ссылается интерпретация как персоной 1, так и персоной 2
  4. наличие вышеуказанного подсчета вместе со списком объектов, на которые ссылается интерпретация, и людей, которые создают интерпретацию.

У меня возникли проблемы конкретно с 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:

  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; .

  1. подсчитайте количество различных интерпретаций объекта

Просто используйте 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. подсчитайте количество объектов, на которые не ссылается интерпретация как персоной 1, так и персоной 2

Возможно, вы сможете найти необычный способ запроса для этого, но я бы просто посчитал отдельные объекты:

 PREFIX ex: lt;http://example.org/gt;SELECT DISTINCT ?objWHERE {  ?x ex:refers_to ?obj .}   

…а затем вычтите результаты из 1. выше. Это легко понять, и у вас уже есть результаты 1. с которыми нужно работать.