是否有一种方法可以获取给定谓词的可变列数?本质上,我想将其转为:
title note
A. 1
A. 2
A. 3
B. 4
B. 5
进入
title note1 note2 note3
A. 1 2 3
B. 4 5 null
例如,我可以将创建的列设置为查询或其他内容中“注释”的最大数量。谢谢。
有几种方法可以解决这个问题。一种方法是更改查询。现在,在一般情况下,无法执行完全符合您要求的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处理结果。