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