获得可变数量的列以在sparql中输出

问题描述 投票:0回答:1

是否有一种方法可以获取给定谓词的可变列数?本质上,我想将其转为:

title note
A.    1
A.    2
A.    3
B.   4
B.   5

进入

title note1 note2 note3
A.    1     2     3
B.    4     5     null

例如,我可以将创建的列设置为查询或其他内容中“注释”的最大数量。谢谢。

sparql rdf
1个回答
0
投票

有几种方法可以解决这个问题。一种方法是更改​​查询。现在,在一般情况下,无法执行完全符合您要求的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) }
}

但是您可以看到,这不是一个很好的解决方案:它无法扩展,并且处理效率也可能非常低。

替代品是各种形式的后处理。为了简化后处理,您可以使用集合运算符至少在一行上获取单个项目的所有注释:

SELECT ?title (GROUP_CONCAT(?note) as ?notes) 
WHERE { ?title :hasNote ?note }
GROUP BY ?title

结果:

title notes
A.    "1 2 3"
B.    "4 5"

然后您可以对?notes变量的值进行后处理,以将其再次拆分为单独的音符。

[另一种解决方案是,您可以使用CONSTRUCT查询而不是SELECT查询,而是返回RDF图而不是表,并直接在代码中使用它。如果您考虑一下,表在RDF世界中有点奇怪:您正在查询图形模型,为什么查询结果不是图形而是表?

CONSTRUCT
WHERE { ?title :hasNote ?note }

...,然后使用您用来执行查询的任何API处理结果。

© www.soinside.com 2019 - 2024. All rights reserved.