SPARQL CONSTRUCT пытается связать значения да / нет из условного подзапроса - PullRequest
0 голосов
/ 04 июня 2018

Продолжение другого вопроса здесь ...

У меня есть (n отрывок из) конструкционный запрос ниже, который успешно извлекает записи по желанию.

CONSTRUCT {
?publication fb:type ?type;
fb:publicationLabel ?publicationLabel;
fb:publicationType ?publicationTypeLabel;
fb:publicationLink ?publicationLink;
}
WHERE {
?publication a bibo:Document .
?publication rdfs:Label ?publicationLabel .
?publication vitro:mostSpecificType ?publicationType .
?publicationType rdfs:Label ?publicationTypeLabel .
?publication obo:ARG_2000028 ?vcard .
?vcard vcard:hasURL ?urllink .
?urllink vcard:url ?publicationLink
}

Вышеупомянутый запрос (немного урезанный) в настоящее время работает нормально.Сейчас я пытаюсь добавить следующую переменную: fb:linkInternalExists

К этой переменной я хочу привязать выходные данные условного подзапроса, который ищет значение (мы будем говорить «internal.url» дляэтот пример) во всех возможных ?publicationLink значениях для конкретного ?publication.

Таким образом, вывод RDF с желаемым добавлением может возвращать что-то вроде следующего:

<rdf:Description rdf:about="https://abcd.fgh/individual/publication12345">   
   <fb:publicationLabel>example record 1</fb:publicationLabel>
   <fb:publicationType>journal</fb:publicationType>
   <fb:publicationLink>http://external.url/bcde</fb:publicationType>
   <fb:publicationLink>http://external.url/abcd</fb:publicationType>
   <fb:linkInternalExists>No</fb:linkInternalExists>
</rdf:Description>
<rdf:Description rdf:about="https://abcd.fgh/individual/publication23456">   
   <fb:publicationLabel>example record 2</fb:publicationLabel>
   <fb:publicationType>conference paper</fb:publicationType>
   <fb:publicationLink>http://external.url/2345</fb:publicationType>
   <fb:publicationLink>http://external.url/1234</fb:publicationType>
   <fb:publicationLink>http://internal.url/1234</fb:publicationType>
   <fb:linkInternalExists>Yes</fb:linkInternalExists>
</rdf:Description>

Мои попыткипри добавлении требуемого подзапроса к описанному выше и успешной привязке его вывода к fb:linkInternalExists не удалось.Поэтому мой вопрос в том, как будет выглядеть измененный запрос.

С уважением

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

После попытки подхода Джина Брукстры запрос истек, но это привело к тому, что я попытался найти другие способы изоляции для internalLink.

Вместо этого я попробовал следующее, вытащив переменные publishingLink и internalLink из различныхUNIONs.

{
?publication a bibo:Document.
?publication obo:ARG_2000028 ?vcard.
?vcard vcard:hasURL ?urllink.
?urllink vcard:url ?publicationLink .
}
UNION {
?publication a bibo:Document .
?publication obo:ARG_2000028 ?vcard .
?vcard vcard:hasURL/vcard:url ?internalLink .
FILTER(CONTAINS(STR(?internalLink), "internal.url"))
}
BIND (IF(BOUND(?internalLink), "Yes", "No") as ?internalLinkExists)

Это успешно вернуло значения для? InternalLink, а затем BIND добавил переменную Yes / No.Работа выполнена!

0 голосов
/ 04 июня 2018

Вам на самом деле не нужен подзапрос для этого.Все, что вам нужно, это ДОПОЛНИТЕЛЬНЫЙ шаблон в сочетании с выражением BIND.

Дополнительный шаблон должен специально искать внутреннюю ссылку, например:

OPTIONAL { 
     ?vcard vcard:hasURL ?internal .
     ?internal vcard:url ?internalLink . 
     FILTER(CONTAINS(STR(?internalLlink), "internal.url")
}

или более кратко:

OPTIONAL { 
     ?vcard vcard:hasURL/vcard:url ?internalLink . 
     FILTER(CONTAINS(STR(?internalLlink), "internal.url")
}

Этот пункт будет связывать значение с ?internalLink, если такая ссылка существует, и в противном случае оставит его свободным.Чтобы затем преобразовать это в выходную форму, которую вы хотите, вы можете добавить следующее условное BIND -класс:

BIND (IF(BOUND(?internalLink), "Yes", "No") as ?internalLinkExists)

И, наконец, наконец, добавить следующее в ваш CONSTRUCT -класс:

?publication fb:linkInternalExists ?internalLinkExists .
...