как объединить два столбца в sparql?

Привет, у меня есть вывод результатов следующим образом:

?name ?o ?x
------------
ABCD  xyz ghh
PQR   xyz hij

как объединить столбцы ?o и ?x в один столбец с именем papers? Мне нужно, чтобы вывод был таким:

?name ?papers
--------------
ABCD  (xyz, ghh, hij)

Обратите внимание, что PQR и ABCD заменяются только ABCD. ABCD и PQR имеют одно и то же свойство, называемое mbox_sha1sum.

Вышеприведенные два были примерами. Мне нужно, чтобы они были такими:

Это текущий запрос sparql:

PREFIX xmlns: <http://xmlns.com/foaf/0.1/> 
PREFIX ontoware: <http://swrc.ontoware.org/ontology#>
SELECT DISTINCT ?name ?x ?o
WHERE { 
 ?s xmlns:mbox_sha1sum ?hash.
 ?s xmlns:made ?o.
 ?s xmlns:name ?name.
 ?o ontoware:year "2009".
 ?r xmlns:mbox_sha1sum ?hash.
 ?r xmlns:made ?x.
 ?x ontoware:year "2008".
}

Мне нужно в основном объединить ?o и ?x в один столбец с именем ?papers. Если это поможет, ?s и ?r имеют разные IRI


person Prasana Venkat Ramesh    schedule 03.12.2013    source источник
comment
возможный дубликат объединения результатов запроса SPARQL   -  person Joshua Taylor    schedule 03.12.2013
comment
Связанный дубликат точно отвечает на этот вопрос. Большая часть его ответа описывает, как выполнить конкатенацию. В последнем абзаце рассматривается проблема удаления повторяющихся результатов с помощью group_by( distinct ?var ; ... ).   -  person Joshua Taylor    schedule 03.12.2013


Ответы (1)


Вы можете сделать это с помощью комбинации группировки и агрегатов, например:

PREFIX xmlns: <http://xmlns.com/foaf/0.1/> 
PREFIX ontoware: <http://swrc.ontoware.org/ontology#>
SELECT (SAMPLE(?name) AS ?GroupName) (GROUP_CONCAT(CONCAT(?x, ", ", ?o) ; SEPARATOR = ", ") AS ?Papers)
WHERE 
{ 
  ?s xmlns:mbox_sha1sum ?hash.
  ?s xmlns:made ?o.
  ?s xmlns:name ?name.
  ?o ontoware:year "2009".
  ?r xmlns:mbox_sha1sum ?hash.
  ?r xmlns:made ?x.
  ?x ontoware:year "2008".
} GROUP BY ?hash

Предложение GROUP BY группирует результаты вместе по переменной ?hash, поскольку вы сгруппировали только по этой переменной, вы не можете выбрать ?name напрямую (потому что, как вы показали, для нее есть несколько значений), поэтому вместо этого вы должны использовать SAMPLE(?name), чтобы дать вам одно из возможных имён (никаких гарантий, какое вы получите).

Затем вы можете использовать агрегат GROUP_CONCAT(), который объединяет все значения данного выражения для группы. Поскольку у вас на самом деле есть два значения, которые вам нужно объединить, вам нужно использовать функцию CONCAT() в качестве выражения.

Имейте в виду, что это не даст вам именно то, что вы хотите, скорее вы получите что-то вроде следующего:

?GroupName | ?Papers
--------------------------------
ABCD       | xyz, ghh, xyz, him

Устранение повторяющихся бумажных записей потенциально возможно, но, вероятно, сделает ваш запрос намного сложнее. Возможно, будет проще удалить дубликаты путем пост-обработки значения ?Papers в Java.

person RobV    schedule 03.12.2013
comment
Дубликаты легко устранить: group_concat( distinct ?x; ...). - person Joshua Taylor; 03.12.2013
comment
Это несколько дает ответ, который я ищу. Спасибо @RobV. Как вы сказали, трудно устранить дубликаты. Использование Different в group_concat приводит к ошибке. Я подожду, чтобы увидеть, даст ли кто-нибудь ответ с отчетливым листингом бумаги или пометит это как ответ. Еще раз спасибо =) - person Prasana Venkat Ramesh; 03.12.2013
comment
@PrasanaVenkatRamesh Можете ли вы уточнить, какую ошибку вы получаете? Ответ на stackoverflow.com/questions/18212697/ показывает, как работает group_by(distinct ...) - person Joshua Taylor; 04.12.2013
comment
@PrasanaVenkatRamesh Перечитывая ваш вопрос, я думаю, что, возможно, в первый раз что-то неправильно понял… - person Joshua Taylor; 04.12.2013