Существует несколько возможных подходов к этому.
Использование CONSTRUCT
запроса
При выборе множества различных переменных вы получите «декартов» результат, потому что вы представляете несколько паттернов совпадения в виде табличной структуры: каждое немного отличающееся совпадение получает свою собственную «строку» в результате. Запрос CONSTRUCT не возвращает табличную структуру, но возвращает подграф, который соответствует вашим данным. Предполагая, что вы используете библиотеку, которая имеет неплохую поддержку для обхода графа RDF, это на самом деле может быть проще и более естественным для обработки, чем сложный запрос SELECT.
Использование GROUP_CONCAT
Вы можете используйте агрегатный оператор GROUP_CONCAT
для получения результата, в котором несколько значений переменной объединяются в одну строку. Например, если у вас ранее было это:
SELECT ?protein ?annotation
....
и вы получили что-то вроде этого:
protein1 annotation1
protein1 annotation2
protein2 annotation3
protein2 annotation4
...
, вы можете использовать это вместо:
SELECT ?protein (GROUP_CONCAT(?annotation) as ?annotations)
и ваш результат будет выглядеть следующим образом:
protein1 "annotation1 annotation2"
protein2 "annotation3 annotation4"
использовать несколько запросов
Другой вариант - использовать несколько запросов: первый запрос просто извлекает идентификаторы ресурса (белки, в вашем случае) , Затем вы перебираете результат и для каждого идентификатора ресурса выполняете дополнительный запрос, который получает дополнительные атрибуты, представляющие интерес для этого конкретного ресурса.