В SPARQL, как выбрать predicateA при условии, что predicateB не существует?

#sparql #rdf

#sparql #rdf

Вопрос:

У меня есть простые данные, подобные этому:

 | s     | p  | o      |
|-------|----|--------|
| repo1 | v1 | high   |
| repo2 | v2 | medium |
| repo2 | v1 | high   |
  

Вопрос в том, как выбрать ?level так, чтобы, если v2 существует, выберите v2 else v1 . Предикат v1 гарантированно существует.

Я пытался

 select ?s, ?level where {
       ?s v2 ?o_v2 .
       ?s v1 ?o_v1 .
       bind(if(bound(?o_v2), ?o_v2, ?o_v1) as ?level)
}
  

Однако это дает мне темы только для тех, у кого есть оба v1 amp; v2 .

Комментарии:

1. select ?s ?level { ?s v1 ?o_v1 . optional { ?s v2 ?o_v2 } bind ( coalesce(?o_v2, ?o_v1) as ?level ) }

2. Это сработало. Спасибо, что познакомили меня с функциями «OPTIONAL amp; COALESCE». Я новичок в SPARQL, можете ли вы предложить хорошее руководство для начинающих? Официальный документ хорош, но не подходит для начинающих.