SPARQL CONSTRUCT尝试从条件子查询中绑定是/否值

时间:2018-06-03 22:09:19

标签: subquery sparql bind rdf construct

继续另一个question here ...

我有一个(摘录自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值中查找值(我们将在本示例中说“internal.url”) {1}}。

所以带有所需加法的RDF输出可以返回如下内容:

?publication

我尝试将所需的子查询添加到上面,并成功将其输出绑定到<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> ,但都没有成功。所以我的问题是修改后的查询会是什么样的。

此致

2 个答案:

答案 0 :(得分:1)

您实际上并不需要子查询。您只需要一个可选模式与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 .

答案 1 :(得分:1)

在尝试Jeen Broekstra的方法时,查询超时,但它导致我尝试其他方法来隔离internalLink。

我尝试了以下方法,同时从不同的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变量。完成工作!