gpt4 book ai didi

sparql - 汇总SPARQL查询的结果

转载 作者:行者123 更新时间:2023-12-03 21:08:19 25 4
gpt4 key购买 nike

我正在查询推文的数据集:

SELECT * WHERE {
?tweet smo:tweeted_at ?date ;
smo:has_hashtag ?hashtag ;
smo:tweeted_by ?account ;
smo:english_tweet true .
FILTER ( ?date >= "20130722"^^xsd:date && ?date < "20130723"^^xsd:date )
}


如果一条推文具有多个主题标签,则每个主题标签的结果集中将包含一行。有什么办法可以将主题标签聚合到数组中吗?

最佳答案

您可以GROUP BY通过标识推文的变量,然后使用GROUP_CONCAT将主题标签连接到类似数组的内容中,但这仍然是一个字符串,您以后需要对其进行解析。例如,给定的数据像

@prefix smo: <http://example.org/> .
@prefix : <http://example.org/> .

:tweet1 smo:tweeted_at "1" ;
smo:has_hashtag "tag1", "tag2", "tag3" ;
smo:tweeted_by "user1" ;
smo:english_tweet true .

:tweet2 smo:tweeted_at "2" ;
smo:has_hashtag "tag2", "tag3", "tag4" ;
smo:tweeted_by "user2" ;
smo:english_tweet true .


您可以使用类似的查询

prefix smo: <http://example.org/>

select ?tweet ?date ?account (group_concat(?hashtag) as ?hashtags) where {
?tweet smo:tweeted_at ?date ;
smo:has_hashtag ?hashtag ;
smo:tweeted_by ?account ;
smo:english_tweet true .
}
group by ?tweet ?date ?account


得到如下结果:

--------------------------------------------------
| tweet | date | account | hashtags |
==================================================
| smo:tweet2 | "2" | "user2" | "tag4 tag3 tag2" |
| smo:tweet1 | "1" | "user1" | "tag3 tag2 tag1" |
--------------------------------------------------


您可以指定在组串联中使用的定界符,因此,如果某些字符不能出现在主题标签中,则可以将其用作定界符。例如,假设 |不能出现在主题标签中,则可以使用:

(group_concat(?hashtag;separator="|") as ?hashtags)


相反,得到

--------------------------------------------------
| tweet | date | account | hashtags |
==================================================
| smo:tweet2 | "2" | "user2" | "tag4|tag3|tag2" |
| smo:tweet1 | "1" | "user1" | "tag3|tag2|tag1" |
--------------------------------------------------


如果您使用的语言具有某种文字数组语法,则您甚至可以复制该语法:

(concat('[',group_concat(?hashtag;separator=","),']') as ?hashtags)




----------------------------------------------------
| tweet | date | account | hashtags |
====================================================
| smo:tweet2 | "2" | "user2" | "[tag4,tag3,tag2]" |
| smo:tweet1 | "1" | "user1" | "[tag3,tag2,tag1]" |
----------------------------------------------------


现在,它不会影响此处的数据,但是 group_concat实际上会在串联中包括重复项(如果它们存在于数据中)。例如,从以下内容开始(为了示例,我仅使用 values提供数据):

prefix : <http://example.org/>

select ?tweet (concat('[',group_concat(?hashtag;separator=','),']') as ?hashtags)
where {
values (?tweet ?hashtag) {
(:tweet1 "tag1") (:tweet1 "tag1") (:tweet1 "tag2") (:tweet1 "tag3")
(:tweet2 "tag2") (:tweet2 "tag3") (:tweet2 "tag4")
}
}
group by ?tweet


我们得到的结果包括 [tag1,tag1,tag2,tag3],即包含 ?hashtag的重复值:

-------------------------------------
| tweet | hashtags |
=====================================
| :tweet2 | "[tag2,tag3,tag4]" |
| :tweet1 | "[tag1,tag1,tag2,tag3]" |
-------------------------------------


我们可以使用 group_concat(distinct ?hashtag;...)来避免这种情况:

prefix : <http://example.org/>

select ?tweet (concat('[',group_concat(distinct ?hashtag;separator=','),']') as ?hashtags)
where {
values (?tweet ?hashtag) {
(:tweet1 "tag1") (:tweet1 "tag1") (:tweet1 "tag2") (:tweet1 "tag3")
(:tweet2 "tag2") (:tweet2 "tag3") (:tweet2 "tag4")
}
}
group by ?tweet




--------------------------------
| tweet | hashtags |
================================
| :tweet2 | "[tag2,tag3,tag4]" |
| :tweet1 | "[tag1,tag2,tag3]" |
--------------------------------

关于sparql - 汇总SPARQL查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18212697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com