SPIN函数中的条件子查询(SPARQL)
如何根据变量是否绑定更改查询公式 我像这样调用magic属性:SPIN函数中的条件子查询(SPARQL),sparql,topbraid-composer,spin-rdf,Sparql,Topbraid Composer,Spin Rdf,如何根据变量是否绑定更改查询公式 我像这样调用magic属性: WHERE { VALUES (?subj) { ([my bound positional parameter value goes here...]) } ?subj :myMagicProperty ?result . } 在magic属性中,我执行一个并集: ?result a :Rule . { ?result :someProp ?subj . } UNION {
WHERE {
VALUES (?subj) {
([my bound positional parameter value goes here...])
}
?subj :myMagicProperty ?result .
}
在magic属性中,我执行一个并集:
?result a :Rule .
{
?result :someProp ?subj .
}
UNION
{
FILTER NOT EXISTS {
?result :someProp ?anyValue .
}
}
换句话说,获取所有结果,其中:someProp
是此值或:someProp
未定义
这里是棘手的部分。如果?sub
未绑定(即,我在值
块中将其设置为未定义
),则上述查询将变为野生并返回所有内容
相反,我想检查?sub
是否未绑定。如果?sub
未绑定,:myMagicProperty
应仅返回以下结果:
FILTER NOT EXISTS {
?result ?someProp ?anyValue .
}
我尝试过使用过滤器
和绑定
函数,但我不知道如何获得正确的行为。当?sub
未绑定时,如何从查询中删除UNION
子句之一
更新
修改了第一个查询以添加值
块。添加缺少的
?结果a:规则。
语句。已将
?someProp
更正为:someProp
首先,我想确认您的意图。我想让您回答以下查询,您可以在TopBraid Composer中运行这些查询
SELECT *
WHERE { GRAPH <http://topbraid.org/examples/kennedys> {
VALUES (?property) {(kennedys:firstName) (kennedys:lastName) (UNDEF)}
{
FILTER(BOUND(?property) )
?s ?property ?result .
}
UNION
{
FILTER(!BOUND(?property))
BIND("not sure what you want to do in this case" AS ?result)
}
}
}
如果?someProp未定义,以及?result和?anyValue,您希望返回什么?此外,您的子图没有将填充该图的断言,因此不会返回任何内容
Ralph诀窍是,我需要使用一个不同于作为参数传入的变量的变量来进行并集。这样,UNION操作不会导致绑定未绑定的参数。在联合之后,我可以使用过滤器根据输入参数控制结果
SELECT ?result
WHERE {
?result a :Rule .
{
SELECT ?rule ?value ?anyValueMatch
WHERE {
{
?rule :someProp ?value .
BIND (false AS ?anyValueMatch) .
}
UNION
{
FILTER NOT EXISTS {
?rule :someProp ?any .
} .
BIND (true AS ?anyValueMatch) .
} .
}
} .
FILTER ((bound(?subj) && (?value = ?subj)) || (?anyValueMatch = true)) .
}
另一种方法是合并:
SELECT ?result
WHERE {
?result a :Rule .
OPTIONAL {
?result :someProp ?value .
}
FILTER (COALESCE(?value = ?subj, !bound(?value)))
}
…这避免了子选择,并简单地筛选只包括与“?value=?subh”匹配的?结果,如果该子句失败,则返回!bind()子句确保也包括没有:someProp属性的匹配项。Ralph,我更新了问题中的magic属性定义,添加了示例代码中缺少的术语。其目的是,“给定某个值?subc,对于所有规则资源,查找具有Rule.someProp==subc或Rule.someProp==null(未定义属性)的规则。如果输入值?subc为null,则仅返回Rule.someProp==null的规则。”我尝试使用类似“FILTER(BOUND(?property))”,但我发现?属性被绑定是因为它下面的语句在同一块中,所以它不会按我希望的方式过滤结果。
SELECT ?result
WHERE {
?result a :Rule .
OPTIONAL {
?result :someProp ?value .
}
FILTER (COALESCE(?value = ?subj, !bound(?value)))
}