当SPARQL中的分组结果为空时,防止GROUP_CONCAT返回空字符串

当SPARQL中的分组结果为空时,防止GROUP_CONCAT返回空字符串,sparql,Sparql,我有一个SPARQL查询,它返回我想要的东西,保存一件事。当我使用GROUP_CONCAT时,我在结果中收到一个空字符串。当分组的值为null时,我希望它在返回集中为null。在我下面的示例中,您可以看到我的团队结果返回,而不是简单地像null一样返回end。对于空字符串,my?person值实际上为空。有没有办法让团队也返回null SPARQL查询: SELECT ?event ?start ?end ?team { SELECT ?event ?start ?end (GROUP_

我有一个SPARQL查询,它返回我想要的东西,保存一件事。当我使用GROUP_CONCAT时,我在结果中收到一个空字符串。当分组的值为null时,我希望它在返回集中为null。在我下面的示例中,您可以看到我的团队结果返回,而不是简单地像null一样返回end。对于空字符串,my?person值实际上为空。有没有办法让团队也返回null

SPARQL查询:

SELECT ?event ?start ?end ?team {
    SELECT ?event ?start ?end (GROUP_CONCAT(DISTINCT ?person;SEPARATOR=",") AS ?team) {
        ?event a cls:Event ;
            prop:startDate ?start .

        OPTIONAL {
            ?event prop:endDate ?end .
            ?event prop:teamMember ?person .
        }

        FILTER (?start >= "2020-05-25" && ?start < "2020-08-31")
    } GROUP BY ?event ?start ?end
} ORDER BY ?start

恐怕SPARQL规范see确认了您所观察到的正确行为

要了解为什么会出现这种情况,请想象一下,你不是在做一个小组讨论,而是在做一个计数。然后,如果团队没有成员,则希望看到0,而不是null

为了得到您想要的,我将尝试将此作为第一次迭代:

SELECT ?event ?start ?end ?team {

    BIND(IF(?team_temp = "", ?team_temp, ?unboundVariable) AS ?team)
#The above check if ?team_temp = "". If it is not, then there is a team and you use ?team-temp as ?team. Otherwise, if ?team_temp = "", you use some unbound variable as ?team, and this unbound variable will be null.

    {SELECT ?event ?start ?end (GROUP_CONCAT(DISTINCT ?person;SEPARATOR=",") AS ?team_temp) {
            ?event a cls:Event ;
                prop:startDate ?start .

            OPTIONAL { ?event prop:endDate ?end }
            OPTIONAL { ?event prop:teamMember ?person }
#Notice that if we want to match ?end and ?person optionally AND independently, then we need two optional statements above here, instead of one large one.

            FILTER (?start >= "2020-05-25" && ?start < "2020-08-31")
        } GROUP BY ?event ?start ?end}
    } ORDER BY ?start

那个查询不可能是正确的。你认为BindifBond的人、团队临时工、团队成员是什么?我的意思是,它在子查询之外,子查询本身从不将?person变量传播到外部查询。而且,语法本身是非法的。子查询必须包装在{}中,并且不能在变量名中使用破折号。我应该避免在外部select的主体中使用BIND,最好将IF表达式直接放入投影中。。。也可以将条件从=更改为!=或者交换IF的参数以获得所需的解决方案,例如IF?team_temp=,$,team_temp as?team
SELECT ?event ?start ?end ?team {

    BIND(IF(?team_temp = "", ?team_temp, ?unboundVariable) AS ?team)
#The above check if ?team_temp = "". If it is not, then there is a team and you use ?team-temp as ?team. Otherwise, if ?team_temp = "", you use some unbound variable as ?team, and this unbound variable will be null.

    {SELECT ?event ?start ?end (GROUP_CONCAT(DISTINCT ?person;SEPARATOR=",") AS ?team_temp) {
            ?event a cls:Event ;
                prop:startDate ?start .

            OPTIONAL { ?event prop:endDate ?end }
            OPTIONAL { ?event prop:teamMember ?person }
#Notice that if we want to match ?end and ?person optionally AND independently, then we need two optional statements above here, instead of one large one.

            FILTER (?start >= "2020-05-25" && ?start < "2020-08-31")
        } GROUP BY ?event ?start ?end}
    } ORDER BY ?start