我需要根据时间动态生成图表的名称.有些人认为我很难
select ?g where {
bind(concat("<urn:myNewGraph_",str(now()),">") as ?g)
}
Run Code Online (Sandbox Code Playgroud)
本来可以做到这一点,但是使用Stardog我得到一个空结果.
相反,我运行这个
select ?g where {
bind(concat("urn:myNewGraph_",str(now())) as ?g)
}
Run Code Online (Sandbox Code Playgroud)
我明白了 urn:myNewGraph_2015-05-28T09:37:11.823Z
有任何想法吗?
而且我不确定即使我能以某种方式得到一个字符串,就像它<urn:myNewGraph_2015-05-28T09:37:11.823Z>可以作为图形名称的有效参数一样,从这个不工作的测试中可以看出:
INSERT {graph ?g {<urn:s> <urn:p> <urn:o>}
where {
?g="<rn:myNewGraph_2015-05-28T09:37:11.823Z>"
}
Run Code Online (Sandbox Code Playgroud)
是否有正确的方法来动态生成urn/iri/uri?
您的原始查询看起来是正确的,并且当我使用不同的SPARQL引擎(Sesame)执行它时会产生有效的结果,所以我猜您可能想要将此报告给Stardog开发人员作为可能的错误.
但是,为了能够使用这样获得的值,它需要是一个实际的URI(或IRI) - 而你生成的是一个文字字符串.
你需要改变两件事:首先,摆脱封闭<和>(这些括号实际上不是IRI的一部分) - 所以实际上你的第二个查询更好.其次,使用该IRI函数将您的字符串值转换为IRI:
INSERT {GRAPH ?g {<urn:s> <urn:p> <urn:o>} }
WHERE {
BIND( IRI(CONCAT("urn:myNewGraph_",STR(NOW()))) as ?g)
}
Run Code Online (Sandbox Code Playgroud)
不确定在你的情况下是否有必要,但通常你可能需要ENCODE_FOR_URI在某处使用该函数,以确保字符串中的任何特殊字符在转换为IRI之前被正确编码/转义.