SPARQL CONSTRUCT 试图从条件子查询中绑定 yes/no 值

SPARQL CONSTRUCT trying to BIND yes/no values from conditional sub query

从另一个 ...

继续

我有一个(n 摘录自 a)构造查询,它成功地根据需要提取记录。

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

对于这个变量,我想在所有可能的 ?publicationLink 值中绑定一个条件子查询的输出,该查询在所有可能的 ?publicationLink 值中查找一个值(我们将在本例中说“internal.url”)对于特定的 ?publication.

因此具有所需添加的 RDF 输出可以 return 类似于以下内容:

<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,但没有成功。所以我的问题是修改后的查询会是什么样子。

此致

您实际上不需要子查询。您所需要的只是一个结合了 BIND 表达式的可选模式。

可选模式应该专门查找内部 link,如下所示:

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")
}

如果 link 存在,此子句会将值绑定到 ?internalLink,否则不绑定。然后将其转换为您想要的输出形式,您可以添加以下条件 BIND-clause:

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

然后当然最后将以下内容添加到您的 CONSTRUCT-子句中:

?publication fb:linkInternalExists ?internalLinkExists .

在尝试 Jeen Broekstra 的方法后,查询超时,但它促使我尝试其他方法来隔离内部链接。

我尝试了以下方法,从不同的 UNION 中提取 publicationLink 和 internalLink 变量。

{
?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 变量。任务完成!