动态生成urn / iri / uri

时间:2015-05-28 09:59:11

标签: sparql

我需要根据时间动态生成图表的名称。 有些人认为这很难,

select ?g where { 
    bind(concat("<urn:myNewGraph_",str(now()),">") as ?g)
}

会完成这个技巧,但是使用Stardog我得到一个空结果。

如果我改为运行

select ?g where { 
    bind(concat("urn:myNewGraph_",str(now())) as ?g)
}

我得到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>"
}

是否有正确的方法来动态生成urn / iri / uri?

1 个答案:

答案 0 :(得分:5)

您的原始查询看起来是正确的,并且当我使用不同的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)
}

在您的情况下不确定是否有必要,但通常您可能需要在某处使用ENCODE_FOR_URI函数,以确保字符串中的任何特殊字符都已正确编码/转义之前把它变成IRI。