SPIN函数中的条件子查询(SPARQL)

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 {

如何根据变量是否绑定更改查询公式

我像这样调用magic属性:

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)))
}