Как совместить две колонки в sparql?

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

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

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

?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" в один столбец, называемый "документами".

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.

Другие вопросы по тегам