我正在查询推文的数据集:
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 )
}
Run Code Online (Sandbox Code Playgroud)
如果推文有多个主题标签,则每个主题标签的结果集中有一行.我有什么方法可以将主题标签聚合成一个数组吗?
Jos*_*lor 38
你可以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 .
Run Code Online (Sandbox Code Playgroud)
你可以使用像这样的查询
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
Run Code Online (Sandbox Code Playgroud)
获得如下结果:
--------------------------------------------------
| tweet | date | account | hashtags |
==================================================
| smo:tweet2 | "2" | "user2" | "tag4 tag3 tag2" |
| smo:tweet1 | "1" | "user1" | "tag3 tag2 tag1" |
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
您可以指定组连接中使用的分隔符,因此如果某些字符无法显示在主题标签中,则可以将其用作分隔符.例如,假设|
不能出现在主题标签中,您可以使用:
(group_concat(?hashtag;separator="|") as ?hashtags)
Run Code Online (Sandbox Code Playgroud)
而是得到
--------------------------------------------------
| tweet | date | account | hashtags |
==================================================
| smo:tweet2 | "2" | "user2" | "tag4|tag3|tag2" |
| smo:tweet1 | "1" | "user1" | "tag3|tag2|tag1" |
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
如果您使用的语言具有一些文字数组语法,您甚至可以复制它:
(concat('[',group_concat(?hashtag;separator=","),']') as ?hashtags)
Run Code Online (Sandbox Code Playgroud)
----------------------------------------------------
| tweet | date | account | hashtags |
====================================================
| smo:tweet2 | "2" | "user2" | "[tag4,tag3,tag2]" |
| smo:tweet1 | "1" | "user1" | "[tag3,tag2,tag1]" |
----------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
现在,它不会影响此处的数据,但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
Run Code Online (Sandbox Code Playgroud)
我们得到的结果包括[tag1,tag1,tag2,tag3]
,即?hashtag
包含的重复值:
-------------------------------------
| tweet | hashtags |
=====================================
| :tweet2 | "[tag2,tag3,tag4]" |
| :tweet1 | "[tag1,tag1,tag2,tag3]" |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)
我们可以通过使用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
Run Code Online (Sandbox Code Playgroud)
--------------------------------
| tweet | hashtags |
================================
| :tweet2 | "[tag2,tag3,tag4]" |
| :tweet1 | "[tag1,tag2,tag3]" |
--------------------------------
Run Code Online (Sandbox Code Playgroud)