получить переменное количество столбцов для вывода в sparql - PullRequest
0 голосов
/ 21 октября 2019

Есть ли способ получить переменное количество столбцов для данного предиката? По сути, я хочу превратить это:

title note
A.    1
A.    2
A.    3
B.   4
B.   5

в

title note1 note2 note3
A.    1     2     3
B.    4     5     null

Например, я могу установить столбцы, созданные на максимальное количество «заметок» в запросе или что-то. Спасибо.

1 Ответ

1 голос
/ 22 октября 2019

Есть несколько способов приблизиться к этому. Одним из способов является изменение вашего запроса. Теперь, в общем случае, невозможно выполнить запрос 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, который вы используете для выполнения запросов.

...