Имеется три возможных объекта для троек: foaf:name
, foaf:givenName
и foaf:familyName
, где операторы имеют либо foaf:name
, либо foaf:givenName
+ foaf:familyName
, например:
<uri1> <foaf:name> "Lolly Loozles" .
<uri2> <foaf:givenName> "Stotly" .
<uri2> <foaf:familyName> "Styles" .
интересно, как написать SPARQL-запрос для возврата новой переменной, такой как pretty_name
, которая является либо значением foaf:name
, либо объединением значений из foaf:givenName
и foaf:familyName
.
В результате получается что-то вроде:
?o | ?pretty_name
----------------------
<uri1> | Lolly Loozles
<uri2> | Stotly Styles
Это то, что я имею до сих пор, но не знаю, как поступить:
PREFIX : <https://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
# select two variables, not ideal...
SELECT ?foaf_fullName ?pretty_name
WHERE {
# Find all triples
?s ?p ?o .
# Binds
OPTIONAL { ?s foaf:name ?foaf_fullName }
OPTIONAL { ?s foaf:givenName ?givenName }
OPTIONAL { ?s foaf:familyName ?familyName }
# Filter where predicate is part of list
FILTER (?p IN (foaf:name, foaf:givenName, foaf:familyName ) )
# Binds
BIND( CONCAT(?givenName, ' ', ?familyName) AS ?pretty_name ) .
}
Я представил и попытался добавить еще BIND
добавить к ?pretty_name
, но у движка SPARQL его не будет:
BIND( ?foaf_fullName AS ?pretty_name ) .
Мне также повезло, написав оператор CONSTRUCT
, чтобы получить значения, которые я ищу, но неу меня нет возможности написать обратно в этот тройной склад (по ряду причин):
CONSTRUCT {
?s :hasPrettyName ?foaf_fullName .
?s :hasPrettyName ?pretty_name .
}
Я думал, что CONSTRUCT
может сопровождать SELECT
, но, должно быть, ошибся?
Любое понимание или предложения будут высоко оценены.