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

Query separate lists of distinct variables in 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_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

我试图查询每个变量的唯一实例,而没有 SPARQL 通常执行的完整笛卡尔积。我现在想要每个查询变量的 all 不同变量匹配列表。

即,如果有 10 种不同的蛋白质和 2 种不同的注释,我如何获得这些结果?我必须单独查询吗?

有几种可能的方法。

使用 CONSTRUCT 查询

选择大量不同变量时,您会得到 "Cartesian" 结果,因为您将多个模式匹配表示为表格结构:每个略有不同的匹配在结果中都有自己的 'row'。 CONSTRUCT 查询不是 return 表格结构,而是 return 与您的数据匹配的子图。假设您使用的库对 RDF 图遍历有一定的支持,这实际上可能比复杂的 SELECT 查询处理起来更容易、更自然。

使用GROUP_CONCAT

您可以使用 GROUP_CONCAT 聚合运算符生成一个结果,其中将变量的多个值连接成一个字符串。例如,如果您以前有这个:

  SELECT ?protein ?annotation
   ....

你得到了这样的结果:

protein1 annotation1
protein1 annotation2
protein2 annotation3
protein2 annotation4
...

你可以改用这个:

SELECT ?protein (GROUP_CONCAT(?annotation) as ?annotations)

您的结果将如下所示:

protein1 "annotation1 annotation2"
protein2 "annotation3 annotation4"

使用多个查询

另一种选择是使用多个查询:第一个查询只检索资源标识符(在您的例子中是蛋白质)。然后迭代结果并针对每个资源标识符执行后续查询,以获取该特定资源感兴趣的其他属性。