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这实际上正是我所需要的。非常感谢!谢谢除了上面提到的那些,在实现中或概念上将查询构造为查询模型有什么缺点吗?他们看到了真实世界的实现吗?我能想到的唯一真正的缺点是,作为一个开发人员,需要一些时间来习惯将查询结果看作是一个图,而不是一个表。但从实施的角度来看,它不应该有太大的区别。我确实在现实世界的应用中使用过它们。