У меня есть запрос построить в SPARQL, который полезен для получения сведений о контрактах:Как я могу построить график RDF для некоторых людей с одним CONSTRUCT?
CONSTRUCT {
?contract dcterm:identifier ?id .
?contract rdfs:label ?label .
?contract pc:bidder ?bidder .
}
WHERE {
OPTIONAL {
?contract dcterm:identifier ?id .
}
OPTIONAL {
?contract rdfs:label ?label .
}
OPTIONAL {
?contract pc:tender ?tender .
?tender pc:bidder ?bidder .
}
}
У меня есть список контрактов, например ПК: c1, шт: c2, и я хотел бы получить в одном одиночный запрос (или один HTTP-запрос), данные о них обоих.
Первая идея заключается в том, чтобы заменить переменную контракта с каждым Ури и избежать конфликтов между другими переменными:
CONSTRUCT {
pc:c1 dcterm:identifier ?id1 .
pc:c1 rdfs:label ?label1 .
pc:c1 pc:bidder ?bidder1 .
pc:c2 dcterm:identifier ?id2 .
pc:c2 rdfs:label ?label2 .
pc:c2 pc:bidder ?bidder2 .
}
WHERE {
OPTIONAL {
pc:c1 dcterm:identifier ?id1 .
}
OPTIONAL {
pc:c1 rdfs:label ?label1 .
}
OPTIONAL {
?pc:c1 pc:tender ?tender1 .
?tender1 pc:bidder ?bidder1 .
}
OPTIONAL {
pc:c2 dcterm:identifier ?id2 .
}
OPTIONAL {
pc:c2 rdfs:label ?label2 .
}
OPTIONAL {
?pc:c2 pc:tender ?tender2 .
?tender2 pc:bidder ?bidder2 .
}
}
Проблема заключается в том, что со многими URIs запрос может стать довольно большим.
Есть ли более компактный способ написать его?
Я попытался с оператором IN (https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#OperatorMapping - 17.4.1.9), но Virtuoso, похоже, не анализирует запрос. Ключевое слово Alse the VALUES (https://www.w3.org/TR/2013/REC-sparql11-query-20130321/#inline-data) показалось хорошим решением, но Йена, похоже, не разобрала его правильно.
Какая версия Jena не работает? – AKSW