Sparql查询,带可选和筛选器

Sparql查询,带可选和筛选器,sparql,Sparql,我编写了sparql查询,如果我绑定了一个变量($company_parameter=XXX),那么结果就是属于XXX公司内部某个人的所有文档;如果我在没有绑定的情况下执行查询,它将返回数据库中的所有文档(甚至是那些不在任何公司工作的人的文档) 查询是这样的,在这里我添加或不添加一行 BIND(XXX作为公司参数)。取决于我想要的结果: SELECT ?doc ?person ?company_label WHERE { ?doc rdf:type <documen

我编写了sparql查询,如果我绑定了一个变量($company_parameter=XXX),那么结果就是属于XXX公司内部某个人的所有文档;如果我在没有绑定的情况下执行查询,它将返回数据库中的所有文档(甚至是那些不在任何公司工作的人的文档)

查询是这样的,在这里我添加或不添加一行
BIND(XXX作为公司参数)。
取决于我想要的结果:

SELECT 
  ?doc
  ?person
  ?company_label
 WHERE { 
  ?doc rdf:type  <document> . 
  OPTIONAL { 
    ?doc <belongsTo> ?person . 
    OPTIONAL { 
       ?person <worksin> ?company . 
       ?company rdf:type  <company> . 
       ?company rdfs:label ?company_label .
    } 
  }
  FILTER (!BOUND($company_parameter) || $company_parameter = ?company) .
}
选择
?医生
?人
?公司标签
何处{
?文件rdf:类型。
可选{
医生,病人。
可选{
个人公司。
?公司rdf:类型。
?公司rdfs:标签?公司标签。
} 
}
过滤器(!BOUND($company_参数)|$company_参数=?company)。
}
当我没有指定绑定,但是 当我指定绑定时会出现一个问题,因为结果包含指定公司的所有记录加上一些(但不是全部)没有公司的记录

这是应该发生的事情吗?
在比较参数之前,我是否应该始终向筛选器添加一个类似于
BIND(?company)
的复选框?

为什么不能执行
BIND(XXX as?company)
并删除
筛选器?甚至更好。更通用的方法是使用
VALUES?company{XXX}
并将其放在开头:
选择?doc?person?company_标签,其中{VALUES?company{XXX}?doc rdf:type.可选{doc?person.可选{person?company rdf:type.?company rdfs:label?company_label.}
我不能在没有过滤器的情况下仅使用绑定,因为公司部分位于可选的内部,这样做将提取所有记录。值也是如此。另外,我有点拘束,这个查询是由编辑器生成的,并且不是直接执行的,因此我不能根据它是否应该与填充的参数一起工作来更改它,它应该在两种情况下都工作。