Боюсь, что спецификация SPARQL (см. здесь ) подтверждает то, что вы наблюдаете как правильное поведение.
Чтобы понять, почему это так, представьте, что вместо выполнения GROUP_CONCAT, вы делали COUNT. Тогда вы, если в команде нет участников, вы хотели бы видеть 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