Как объединить два разных, но коррелированных набора результатов запроса Sparql в один? - PullRequest
0 голосов
/ 18 апреля 2019

Я работаю над проектом, который находит корреляцию между тенденциями голосования на американских выборах с демографическими данными штата и их соответствующими предпочтениями при голосовании.У меня есть три отдельных документа rdf, которые содержат одинаковые ключи, но содержат разные типы данных.Поэтому я попробовал следующий запрос SPARQL на сервере Fuseki,

SELECT ?p ?o1 ?object3
WHERE {
   {  
     ?subject <http://semanticspiders.org/demographic#AZ> ?object .
     ?object <http://semanticspiders.org/demographic#age> ?o .
     ?o ?p ?o1
   } 

  UNION
  {
     ?subject <http://semanticspiders.org/voterTurnout#AZ> ?object .
     ?object <http://semanticspiders.org/voterTurnout#age> ?o .
     ?o ?p ?o1

  }
  UNION 
  {
     ?subject <http://semanticspiders.org/voterBias#age> ?object .
     ?object ?p ?object2 .
     ?object2 <http://semanticspiders.org/voterBias#left> ?object3


  }
  FILTER (?p = <http://semanticspiders.org/demographic#18-29> || ?p = <http://semanticspiders.org/voterBias#18-29>)


}  

, который дает мне следующий результат.

Sparql results

Однако я хочу, чтобы набор результатов выглядел примерно так: {18-29, "21.9", "5.161"}

Я пробовал групповые и другие фильтры, но не смог заставить его работать.Любая помощь приветствуется.

1 Ответ

2 голосов
/ 19 апреля 2019
  1. Удалить две строки с надписью UNION.Объединение предназначено для возврата строк, которые соответствуют одному шаблону или другому шаблону.Вы хотите строку, которая соответствует одному шаблону и другому шаблону.Это то, что SPARQL делает по умолчанию.Держите фигурные скобки {...} вокруг каждой группы.
  2. Удалите FILTER.Если вы используете переменные правильно, вам не понадобится фильтр.
  3. Убедитесь, что у каждой из трех {...} групп есть свои собственные переменные.Они не должны иметь общих переменных.Если вы разделяете переменные между группами, то они должны иметь одинаковое значение, иначе строка будет удалена.
  4. Кстати, ?subject, ?object и ?pдовольно ужасные имена переменных.Назовите свои переменные в честь того, что будет с ними связано.Итак, ?age или ?voterBias делают для лучших имен.
  5. Создайте новую переменную, которая является общей для трех групп, возможно, назовите ее ?key или ?ageRange какпредложено в комментариях.Эта переменная должна содержать значение, которое вы хотите использовать для объединения групп, например, 18-29.Таким образом, он должен получить точно такое же значение в каждой из трех групп.Похоже, что это значение не существует непосредственно в ваших данных, поэтому его нужно вычислить с помощью выражения, а затем связать с переменной в каждой группе, используя BIND(... AS ?key).

.Вы, вероятно, хотите работать с каждой из трех групп по отдельности и помещать их в запрос только после того, как каждая группа сработает.Как правило, результат для каждой группы должен иметь ?key со значениями, которые согласуются между группами, а в противном случае в результате есть только переменные, которые не используются совместно с другой группой.

...