sparql - 如何在sparql中合并两列?

标签 sparql jena protege gruff

嗨,我的结果输出如下:

?name ?o ?x
------------
ABCD  xyz ghh
PQR   xyz hij

如何将 ?o 和 ?x 列合并到称为论文的一列中? 我需要这样的输出:

?name ?papers
--------------
ABCD  (xyz, ghh, hij)

请注意,PQR 和 ABCD 仅被 ABCD 替换。 ABCD 和 PQR 具有相同的属性,称为 mbox_sha1sum

以上两个是例子。我需要它们像这样:

这是当前的 sparql 查询:

PREFIX xmlns: <http://xmlns.com/foaf/0.1/> 
PREFIX ontoware: <http://swrc.ontoware.org/ontology#>
SELECT DISTINCT ?name ?x ?o
WHERE { 
 ?s xmlns:mbox_sha1sum ?hash.
 ?s xmlns:made ?o.
 ?s xmlns:name ?name.
 ?o ontoware:year "2009".
 ?r xmlns:mbox_sha1sum ?hash.
 ?r xmlns:made ?x.
 ?x ontoware:year "2008".
}

我需要将 ?o 和 ?x 合并到一个名为 ?papers 的列中 如果有帮助的话, ?s 和 ?r 有不同的 IRI

最佳答案

您可以通过组合分组和聚合来完成此操作,如下所示:

PREFIX xmlns: <http://xmlns.com/foaf/0.1/> 
PREFIX ontoware: <http://swrc.ontoware.org/ontology#>
SELECT (SAMPLE(?name) AS ?GroupName) (GROUP_CONCAT(CONCAT(?x, ", ", ?o) ; SEPARATOR = ", ") AS ?Papers)
WHERE 
{ 
  ?s xmlns:mbox_sha1sum ?hash.
  ?s xmlns:made ?o.
  ?s xmlns:name ?name.
  ?o ontoware:year "2009".
  ?r xmlns:mbox_sha1sum ?hash.
  ?r xmlns:made ?x.
  ?x ontoware:year "2008".
} GROUP BY ?hash

GROUP BY 子句通过 ?hash 变量将结果分组在一起,因为您仅按此变量分组,然后无法选择 ?name 直接(因为正如您所显示的,它有多个值),因此您必须使用 SAMPLE(?name) 来为您提供可能的名称之一(不保证您会得到哪个名称) )。

然后,您可以使用 GROUP_CONCAT() 聚合将给定表达式的所有值组合在一起。由于您实际上有两个需要组合的值,因此需要使用 CONCAT() 函数作为表达式。

请记住,这不会给您确切想要的东西,而是您会得到如下所示的内容:

?GroupName | ?Papers
--------------------------------
ABCD       | xyz, ghh, xyz, him

消除重复的纸质条目是可能的,但可能会使您的查询变得更加复杂。通过在 Java 中后处理 ?Papers 值可能会更容易消除重复项。

关于sparql - 如何在sparql中合并两列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20341811/

相关文章:

graph - 尝试提交事务时,Jena 的 TDB 数据集出现 TDBTransactionException

ontology - 使用曼彻斯特语法查询 OWL API 中的匿名类

ontology - OWL 限制中的枚举

SPARQL:投影不存在的变量

rdf - 通过 Jena 库从 RDF/XML 文档中提取 URI

java - org.apache.jena.rdf.model 不存在

logic - 如何在 OWL2/Protege/Ontology 中将属性定义为两个 "conditions"的交集

r - 使用 SPARQL 计算 DBpedia wikilink 和外部链接的数量

python - 在 Python 中编写从 SPARQL 查询返回的 JSON 数据的正确方法

apache-spark - 如何将Virtuoso分布式版本链接到Hadoop