gpt4 book ai didi

if-statement - 使用 IF 将变量绑定(bind)到两个值之一?

转载 作者:行者123 更新时间:2023-12-03 23:23:11 26 4
gpt4 key购买 nike

在以下 SPARQL 查询中,我不确定如何使用 if将两个字符串之一绑定(bind)到变量 ?result .我听说有“范围内”和“范围外”的概念,但我看不出有什么区别。我也试过把 if select 中的子句线,但它也没有工作。如何修复此查询以绑定(bind) ?result根据条件到两个字符串之一?

SELECT ?result
WHERE{
?chain rdf:type rdfs:Property .
?chain rdfs:domain <http://www.vs.cs.hs-rm.de/ontostor/SVC#MDiskGroup> .
?chain rdfs:range <http://www.vs.cs.hs-rm.de/ontostor/SVC#IOgroup> .
?this ?chain ?arg .
?arg io:id ?var .
IF(?var = "0"^^xsd:integer,
BIND(" *"^^xsd:string AS ?result),
BIND(""^^xsd:string AS ?result)) .
}

最佳答案

if SPARQL 中的运算符不是有时在编程语言中的语句,而是用于创建表达式(具有特殊评估语义)的“函数形式”。 if(test,a,b) 的值是 a如果 test是真的,b如果 test是假的。正如文档所说:

17.4.1.2 IF

rdfTerm  IF (expression1, expression2, expression3)

The IF function form evaluates the first argument, interprets it as aeffective boolean value, then returns the value of expression2 if theEBV is true, otherwise it returns the value of expression3. Only oneof expression2 and expression3 is evaluated. If evaluating the firstargument raises an error, then an error is raised for the evaluationof the IF expression.

Examples: Suppose ?x = 2, ?z = 0 and ?y is not bound in some querysolution:

IF(?x = 2, "yes", "no")     returns "yes"
IF(bound(?y), "yes", "no") returns "no"
IF(?x=2, "yes", 1/?z) returns "yes", the expression 1/?z is not evaluated
IF(?x=1, "yes", 1/?z) raises an error
IF("2" > 1, "yes", "no") raises an error

所以, if不是像在编程语言中那样的语句,但它只是一个接受三个参数并返回一个值的函数(尽管是惰性求值)。 SPARQL 是一种查询语言,没有被执行的语句;它是一种查询语言,用于匹配图形中的模式并将变量绑定(bind)到值。所以 if是一个函数,碰巧如果第一个参数为真,则返回第二个参数,否则返回第三个。通常,您会将函数的值绑定(bind)到变量
bind( function(args...) as ?variable )
这种情况也不异常(exception)。您可以调用 if函数并将其结果绑定(bind)到一个变量
bind( if(condition,then,else) as ?result )
在您的情况下,这意味着您将使用以下查询。我添加了一些换行符来提高可读性,但它们不是必需的。 SPARQL 查询中的整数是类型为 xsd:integer 的文字的简写。 ,所以我也使用过(感谢 RobV 的评论) 0而不是 "0"^^xsd:integer . (见 2.3.2 Matching Literals with Numeric Types。)
bind(if(?var = 0,
" *"^^xsd:string,
""^^xsd:string )
as ?result)
如果我们真的想进一步缩短它,那么我们可以使用 xsd:string作为构造函数,然后执行(参见 17.5 XPath Constructor Functions ):
bind(xsd:string(if(?var = 0,"    *", "")) as ?result)
如果你习惯于做类似的事情,这可能看起来有点奇怪
String result;
if ( var == 0 ) {
result = "case 1";
}
else {
result = "case 2";
}
但是许多语言实际上提供了一个三元运算符,可以让你做的更短
String result = (var == 0) ? "case 1" : "case 2";
反而。这是您通过 SPARQL 获得的功能。

关于if-statement - 使用 IF 将变量绑定(bind)到两个值之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21116223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com