Возвращать значения под тем же столбцом в запросе SPARQL - PullRequest
1 голос
/ 15 апреля 2019

Имеется три возможных объекта для троек: 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, но, должно быть, ошибся?

Любое понимание или предложения будут высоко оценены.

1 Ответ

1 голос
/ 16 апреля 2019

Использование @StanislavKralin комментариев / предложений по использованию COALESCE без IF предложений прекрасно работает:

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( COALESCE(?foaf_fullName, CONCAT(?givenName, ' ', ?familyName)) AS ?pretty_name )

}
...