在 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 中处理结果。