如何在SPARQL中使VALUES语句成为可选语句

如何在SPARQL中使VALUES语句成为可选语句,sparql,optional,Sparql,Optional,我有一个sparql查询,其中包含VALUES语句 VALUES (?Name ?department) { ("Marc" "Marketing") ("John" "IT") } 我想让它成为可选的;只有当你的名字是马克或约翰时才运行。 否则,它应该被忽略。 我试过: 但它不起作用。有什么想法吗?这样做的方法不是让VALUES子句成为可选的,因为这将返回所有内容,无论它是否匹配VALUES过滤器的任何部分。取而代之的是考虑减去与联合结合: PREFIX rdf:

我有一个sparql查询,其中包含VALUES语句

VALUES (?Name ?department) {
       ("Marc" "Marketing")
       ("John" "IT")
}
我想让它成为可选的;只有当你的名字是马克或约翰时才运行。 否则,它应该被忽略。 我试过:


但它不起作用。有什么想法吗?

这样做的方法不是让VALUES子句成为可选的,因为这将返回所有内容,无论它是否匹配VALUES过滤器的任何部分。取而代之的是考虑减去与联合结合:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX :   <http://example#>
SELECT *
WHERE {
  {
    ?person :name ?name ;
            :department ?department .
    MINUS {
      VALUES ?name { "Marc" "John" }
    }
  }
  UNION {
    ?person :name ?name ;
            :department ?department .
    VALUES (?name ?department) {
      ("Marc" "Marketing")
      ("John" "IT")
    }
  }
}
前缀rdf:
前缀rdfs:
前缀:
挑选*
在哪里{
{
?人:姓名?姓名;
:部门?部门。
减去{
值?名称{“Marc”“John”}
}
}
联合{
?人:姓名?姓名;
:部门?部门。
值(?名称?部门){
(“Marc”“营销”)
(“约翰”“它”)
}
}
}

表达式的第一部分匹配任何不叫Marc或John的人。第二部分像往常一样应用值过滤器。

您使用的是哪个SPARQL处理器?我在ApacheJena上试过,效果很好。我也在用ApacheJena做java项目。问题是,当?Name取值“Marc”时,上面的代码没有运行。请检查该值是否正确-它可能是一种标记为literal的语言?SPARQL 1.1
BIND
结合使用,如果
可以做到这一点。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX :   <http://example#>
SELECT *
WHERE {
  {
    ?person :name ?name ;
            :department ?department .
    MINUS {
      VALUES ?name { "Marc" "John" }
    }
  }
  UNION {
    ?person :name ?name ;
            :department ?department .
    VALUES (?name ?department) {
      ("Marc" "Marketing")
      ("John" "IT")
    }
  }
}