Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在SPARQL中查询不同变量的单独列表?_Python_Sparql - Fatal编程技术网

Python 在SPARQL中查询不同变量的单独列表?

Python 在SPARQL中查询不同变量的单独列表?,python,sparql,Python,Sparql,假设我有这样一个问题: WHERE { <http://purl.uniprot.org/uniprot/Q8NAT1> up:classifiedWith ?annotation . ?protein up:classifiedWith ?annotation . <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?O3OET. ?O3OET a up:Topological_Domain_An

假设我有这样一个问题:

WHERE {
<http://purl.uniprot.org/uniprot/Q8NAT1> up:classifiedWith ?annotation .
?protein up:classifiedWith ?annotation .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?O3OET.
    ?O3OET a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?Q02UJ .
    ?protein a up:Protein .
    ?protein up:annotation ?otherTop .
    ?otherTop a up:Topological_Domain_Annotation;
             rdfs:comment ?topology;
             up:range ?OTHERRANGE .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?S7IK0.
    ?S7IK0 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
    ?protein a up:Protein .
    ?protein up:annotation ?VAR2 .
    ?VAR2 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
<http://purl.uniprot.org/uniprot/Q8NAT1> up:citation ?citation .
?protein up:citation ?citation .
}
GROUP BY ?protein
protein1 annotation1
protein1 annotation2
protein2 annotation3
protein2 annotation4
...
protein1 "annotation1 annotation2"
protein2 "annotation3 annotation4"
在这里,我试图查询每个变量的唯一实例,而不使用SPARQL通常使用的完全笛卡尔积。现在,我需要一个列表,列出每个查询变量的所有不同变量匹配项


也就是说,如果有10种不同的蛋白质和2种不同的注释,我如何得到这些结果?我需要单独查询吗?

有几种可能的方法

使用构造查询 当选择不同变量的负载时,您会得到笛卡尔结果,因为您将多个模式匹配表示为一个表格结构:每个稍有不同的匹配都会在结果中获得自己的“行”。构造查询不返回表格结构,而是返回与数据匹配的子图。假设您使用的库对RDF图遍历有一定的支持,那么这实际上可能比复杂的SELECT查询更容易处理,也更自然

使用组_CONCAT 您可以使用GROUP_CONCAT aggregate运算符生成一个结果,其中一个变量的多个值被连接到一个字符串中。例如,如果您以前有以下情况:

  SELECT ?protein ?annotation
   ....
你得到了这样的结果:

WHERE {
<http://purl.uniprot.org/uniprot/Q8NAT1> up:classifiedWith ?annotation .
?protein up:classifiedWith ?annotation .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?O3OET.
    ?O3OET a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?Q02UJ .
    ?protein a up:Protein .
    ?protein up:annotation ?otherTop .
    ?otherTop a up:Topological_Domain_Annotation;
             rdfs:comment ?topology;
             up:range ?OTHERRANGE .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?S7IK0.
    ?S7IK0 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
    ?protein a up:Protein .
    ?protein up:annotation ?VAR2 .
    ?VAR2 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
<http://purl.uniprot.org/uniprot/Q8NAT1> up:citation ?citation .
?protein up:citation ?citation .
}
GROUP BY ?protein
protein1 annotation1
protein1 annotation2
protein2 annotation3
protein2 annotation4
...
protein1 "annotation1 annotation2"
protein2 "annotation3 annotation4"
您可以改为使用此选项:

SELECT ?protein (GROUP_CONCAT(?annotation) as ?annotations)
您的结果将如下所示:

WHERE {
<http://purl.uniprot.org/uniprot/Q8NAT1> up:classifiedWith ?annotation .
?protein up:classifiedWith ?annotation .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?O3OET.
    ?O3OET a up:Topological_Domain_Annotation;
         rdfs:comment ?topology;
         up:range ?Q02UJ .
    ?protein a up:Protein .
    ?protein up:annotation ?otherTop .
    ?otherTop a up:Topological_Domain_Annotation;
             rdfs:comment ?topology;
             up:range ?OTHERRANGE .
    <http://purl.uniprot.org/uniprot/Q8NAT1> up:annotation ?S7IK0.
    ?S7IK0 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
    ?protein a up:Protein .
    ?protein up:annotation ?VAR2 .
    ?VAR2 a up:Pathway_Annotation ;
          rdfs:seeAlso ?pathway .
<http://purl.uniprot.org/uniprot/Q8NAT1> up:citation ?citation .
?protein up:citation ?citation .
}
GROUP BY ?protein
protein1 annotation1
protein1 annotation2
protein2 annotation3
protein2 annotation4
...
protein1 "annotation1 annotation2"
protein2 "annotation3 annotation4"
使用多个查询
另一种选择是使用多个查询:第一个查询只检索资源标识符,在您的例子中是蛋白质。然后对结果进行迭代,并对每个资源标识符执行后续查询,以获取该特定资源的其他感兴趣属性。

这是否回答了您的问题?在UniProt中,每个注释都有自己的IRI@JeenBroekstra的回答是正确的,但请随时写信给我help@uniprot.org对于生物学和uniprot数据模型,@JeenBroekstra这实际上正是我所需要的。非常感谢!谢谢除了上面提到的那些,在实现中或概念上将查询构造为查询模型有什么缺点吗?他们看到了真实世界的实现吗?我能想到的唯一真正的缺点是,作为一个开发人员,需要一些时间来习惯将查询结果看作是一个图,而不是一个表。但从实施的角度来看,它不应该有太大的区别。我确实在现实世界的应用中使用过它们。