Как совместить две колонки в 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.