Есть несколько способов приблизиться к этому. Одним из способов является изменение вашего запроса. Теперь, в общем случае, невозможно выполнить запрос SELECT, который делает именно то, что вы хотите. Однако, если вам заранее известно, какое максимальное количество нот в заголовке, вы можете сделать это.
Предположим, ваш исходный запрос был примерно таким:
SELECT ?title ?note
WHERE { ?title :hasNote ?note }
И, предположим, вы знаете, что заголовки имеют не более 3 заметок, вы могли бы , вероятно, (не проверено) сделать что-то вроде этого:
SELECT ?title ?note1 ?note2 ?note3
WHERE {
?title :hasNote ?note1 .
OPTIONAL { ?title :hasNote ?note2 . FILTER (?note2 != ?note1) }
OPTIONAL { ?title :hasNote ?note3 . FILTER (?note3 != ?note1 && ?note3 != ?note2) }
}
Как видите, это не очень хорошее решение, хотя:он не масштабируется и, вероятно, очень неэффективен для обработки.
Альтернативами являются различные формы постобработки. Чтобы упростить последующую обработку, вы можете использовать оператор агрегирования, чтобы получить все заметки для одного элемента в одной строке как минимум:
SELECT ?title (GROUP_CONCAT(?note) as ?notes)
WHERE { ?title :hasNote ?note }
GROUP BY ?title
результат:
title notes
A. "1 2 3"
B. "4 5"
Выможет затем обработать значения переменной ?notes
, чтобы снова разделить их на отдельные заметки.
Другое решение состоит в том, что вместо использования запроса SELECT вы используете запрос CONSTRUCT, чтобы вернуть вам RDF-график, а не таблицу, и работаете непосредственно с этим в вашем коде. Таблицы немного странны в мире RDF, если подумать: вы запрашиваете модель графа, почему результат запроса не граф, а таблица?
CONSTRUCT
WHERE { ?title :hasNote ?note }
... и затем обрабатываетепривести к тому API, который вы используете для выполнения запросов.