如何将SPARQL查询结果的URI拆分为多个部分?

时间:2013-05-11 03:38:33

标签: sparql semantic-web

我是语义Web编程的新手,我正在尝试使用SPARQL查询做一些我不完全确定是可行的。但是,我想在尝试另一种方法之前我会问大师。

我有一个SPARQL查询,它返回一个URI资源作为其中一列。示例如下:

http://purl.uniprot.org/uniprot/Q9UKM9

我想获取该URL的最后一部分(Q9UKM9)并将其放入一个变量中以在regex命令中使用,以找到相同的蛋白质(由我正在提取的那个数字标识)另一种资源。

我不能像以下那样直接查询:

?random_resource_one X:propertyOne ?what_I_am_interested_in .
?random_resource_two Y:hasURI ?what_I_am_interested_in . 

因为资源URI不同:

http://purl.uniprot.org/interpro/IPR000504

VS

http://purl.org/obo/owl/InterPro#InterPro_IPR000504

我对创意完全开放!谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用SPARQL的STRAFTER函数:

 STRAFTER("http:xx//purl.uniprot.org/uniprot/Q9UKM9", "http:xx//purl.uniprot.org/uniprot/")

将返回“Q9UKM9”。

作为进一步的提示,您可以重用名称空间前缀作为简写。所以假设你的查询中有这个:

PREFIX uniprot: <http:xx//purl.uniprot.org/uniprot/>

你可以这样做:

 STRAFTER("http:xx//purl.uniprot.org/uniprot/Q9UKM9", str(uniprot:))

答案 1 :(得分:1)

sparql 1.1中有一个substr(...)函数,但它需要一个索引作为第二个运算符,所以我想它在你的情况下并不那么有用。 http://www.w3.org/TR/sparql11-query/#func-substr

我建议使用替换功能 http://www.w3.org/TR/sparql11-query/#func-replace

有类似的东西: 替换(“http://xxpurl.uniprot.org/interpro/IPR000504”,“http://xxpurl.uniprot.org/interpro/”,“”) 为了获得唯一的ID,然后用或多或少的东西测试它(只是为了给你一个想法):

SELECT DISTINCT *
WHERE {

    ?uri_1 a ?type_1 .
    ?uri_2 a ?type_2 .

    FILTER (replace(str(?uri_1),"http://xxpurl.uniprot.org/interpro/", "") = replace(str(?uri_2),"http://xxpurl.org/obo/owl/InterPro#InterPro_", ""))

}

让我们知道它是否有效; - )