在 sparql 中获取可变数量的输出列
get a variable number of columns for output in sparql
有没有办法为给定谓词获取可变数量的列?本质上,我想把这个:
title note
A. 1
A. 2
A. 3
B. 4
B. 5
进入
title note1 note2 note3
A. 1 2 3
B. 4 5 null
比如,我可以将创建的列设置为查询中的最大 "notes" 数吗?谢谢
有几种方法可以解决这个问题。一种方法是更改您的查询。现在,在一般情况下,不可能执行完全符合您要求的 SELECT 查询。但是,如果您事先知道每个标题的最大注释数是多少,则可以这样做。
假设您的原始查询是这样的:
SELECT ?title ?note
WHERE { ?title :hasNote ?note }
假设你知道标题最多有 3 个音符,你可以可能(未经测试)做这样的事情:
SELECT ?title ?note1 ?note2 ?note3
WHERE {
?title :hasNote ?note1 .
OPTIONAL { ?title :hasNote ?note2 . FILTER (?note2 != ?note1) }
OPTIONAL { ?title :hasNote ?note3 . FILTER (?note3 != ?note1 && ?note3 != ?note2) }
}
如您所见,这不是一个很好的解决方案:它无法扩展,而且处理效率可能也很低。
备选方案是 post-processing 的各种形式。为了使 post-process 更简单,您可以使用聚合运算符至少在一行中获取单个项目的所有注释:
SELECT ?title (GROUP_CONCAT(?note) as ?notes)
WHERE { ?title :hasNote ?note }
GROUP BY ?title
结果:
title notes
A. "1 2 3"
B. "4 5"
然后您可以 post-process ?notes
变量的值再次将它们拆分为单独的注释。
另一种解决方案是不使用 SELECT 查询,而是使用 CONSTRUCT 查询返回 RDF 图,而不是 table,并在代码中直接使用它.如果您考虑一下,表在 RDF 世界中有点奇怪:您正在查询图形模型,为什么查询结果不是图形而是 table?
CONSTRUCT
WHERE { ?title :hasNote ?note }
...然后在您用来执行查询的 API 中处理结果。
有没有办法为给定谓词获取可变数量的列?本质上,我想把这个:
title note
A. 1
A. 2
A. 3
B. 4
B. 5
进入
title note1 note2 note3
A. 1 2 3
B. 4 5 null
比如,我可以将创建的列设置为查询中的最大 "notes" 数吗?谢谢
有几种方法可以解决这个问题。一种方法是更改您的查询。现在,在一般情况下,不可能执行完全符合您要求的 SELECT 查询。但是,如果您事先知道每个标题的最大注释数是多少,则可以这样做。
假设您的原始查询是这样的:
SELECT ?title ?note
WHERE { ?title :hasNote ?note }
假设你知道标题最多有 3 个音符,你可以可能(未经测试)做这样的事情:
SELECT ?title ?note1 ?note2 ?note3
WHERE {
?title :hasNote ?note1 .
OPTIONAL { ?title :hasNote ?note2 . FILTER (?note2 != ?note1) }
OPTIONAL { ?title :hasNote ?note3 . FILTER (?note3 != ?note1 && ?note3 != ?note2) }
}
如您所见,这不是一个很好的解决方案:它无法扩展,而且处理效率可能也很低。
备选方案是 post-processing 的各种形式。为了使 post-process 更简单,您可以使用聚合运算符至少在一行中获取单个项目的所有注释:
SELECT ?title (GROUP_CONCAT(?note) as ?notes)
WHERE { ?title :hasNote ?note }
GROUP BY ?title
结果:
title notes
A. "1 2 3"
B. "4 5"
然后您可以 post-process ?notes
变量的值再次将它们拆分为单独的注释。
另一种解决方案是不使用 SELECT 查询,而是使用 CONSTRUCT 查询返回 RDF 图,而不是 table,并在代码中直接使用它.如果您考虑一下,表在 RDF 世界中有点奇怪:您正在查询图形模型,为什么查询结果不是图形而是 table?
CONSTRUCT
WHERE { ?title :hasNote ?note }
...然后在您用来执行查询的 API 中处理结果。