连接非特定SPARQL查询的最佳实践?

连接非特定SPARQL查询的最佳实践?,sparql,rdf,owl,Sparql,Rdf,Owl,我正在编写一些python代码来动态构建任意长度的SPARQL查询 我有一个子查询,如下所示: ?topObj a up:Topological_Domain_Annotation; rdfs:comment '{}'; up:range ?range. ?proteins a up:Protein .

我正在编写一些python代码来动态构建任意长度的SPARQL查询

我有一个子查询,如下所示:

                ?topObj a up:Topological_Domain_Annotation;
                         rdfs:comment '{}';
                         up:range ?range.

                 ?proteins a up:Protein .
                 ?proteins up:annotation ?otherTop .
                 ?otherTop a up:Topological_Domain_Annotation;
                           rdfs:comment '{}';
                           up:range ?otherRange.""",
其中,根据用户指定的输入,{}的格式为and.format()。我想要一种方法来堆叠可能与其他对象匹配的多个子查询,即
rdfs:comment'{}行。当然,我用来遍历到所需对象的变量名绑定在第一个子查询中

最好的解决办法是:

  • 生成随机变量以存储每个小查询的遍历节点
  • 使用某种我不知道的属性路径/空白节点技巧
编辑:

下面是一个使用随机变量方法将上述模板连接在一起生成的示例查询

SELECT DISTINCT ?proteins
WHERE {
    <http://purl.uniprot.org/uniprot/P04439> up:annotation ?1WGQM.
    ?1WGQM a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?VLIT1 .
    <http://purl.uniprot.org/uniprot/P01911> up:annotation ?FIICT.
    ?FIICT a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?W89B2 .
    <http://purl.uniprot.org/uniprot/P10321> up:annotation ?WU6G3.
    ?WU6G3 a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?ZSIQ3 .
    ?proteins a up:Protein .
    ?proteins up:annotation ?otherTop .
    ?otherTop a up:Topological_Domain_Annotation;
             rdfs:comment ?topology;
             up:range ?OTHERRANGE .
}
LIMIT 10
选择不同的蛋白质
在哪里{
向上:注释?1WGQM。
?1WGQM a up:拓扑域注释;
rdfs:注释?拓扑;
向上:射程?VLIT1。
向上:注释?FIICT。
?FIICT a up:拓扑域注释;
rdfs:注释?拓扑;
向上:范围?W89B2。
向上:注释?WU6G3。
?WU6G3 a up:拓扑域注释;
rdfs:注释?拓扑;
向上:范围?ZSIQ3。
?蛋白质a up:蛋白质。
?蛋白质向上:注释?其他顶部。
?其他补充:拓扑域注释;
rdfs:注释?拓扑;
向上:范围?其他范围。
}
限制10

只需使用BNodes,而不是为这些变量生成唯一的名称,例如,以下内容:

SELECT DISTINCT ?proteins
WHERE {
    <http://purl.uniprot.org/uniprot/P04439> up:annotation [
        a up:Topological_Domain_Annotation;
        rdfs:comment ?topology;
        up:range [] 
    ].
    <http://purl.uniprot.org/uniprot/P01911> up:annotation [
        a up:Topological_Domain_Annotation;
        rdfs:comment ?topology;
        up:range []
    ] .
    <http://purl.uniprot.org/uniprot/P10321> up:annotation [
        a up:Topological_Domain_Annotation;
        rdfs:comment ?topology;
        up:range [] 
    ].

    ?proteins a up:Protein .
    ?proteins up:annotation [
            a up:Topological_Domain_Annotation;
            rdfs:comment ?topology;
            up:range [] 
        ].
}
LIMIT 10
选择不同的蛋白质
在哪里{
up:注释[
上:拓扑域注释;
rdfs:注释?拓扑;
向上:范围[]
].
up:注释[
上:拓扑域注释;
rdfs:注释?拓扑;
向上:范围[]
] .
up:注释[
上:拓扑域注释;
rdfs:注释?拓扑;
向上:范围[]
].
?蛋白质a up:蛋白质。
?蛋白质组:注释[
上:拓扑域注释;
rdfs:注释?拓扑;
向上:范围[]
].
}
限制10

HTH

只是澄清一下,您有一些常量用于替换模板中的
{}
,然后您希望发出一个具有多个子选择的查询,每个子选择都提供具有不同常量集的解决方案。您打算如何加入这些子选择的结果(在哪些公共变量上)?给我们一个examle查询,选择正确的数据,这样我们就可以在。。。请记住,只有子查询的投影中的变量对SPARQL查询的其余部分可见。我编辑了文章以包括一个示例。有没有更简单的方法?我只是生成了随机字符串来匹配任意数量的子查询的这些公共节点。您可以用空节点替换具有随机名称的变量
[]