传递一个变量给SparqlParameterizedString dotNetRDF

本文关键字:变量 SparqlParameterizedString dotNetRDF 一个 | 更新日期: 2023-09-27 17:51:18

我试图将参数化查询传递给dotNetRDF中的executequery()函数

我的代码是

   preference =  (d1.send()); // d1.send(); method returns a string value

   SparqlParameterizedString queryString = new SparqlParameterizedString();
   queryString.CommandText = @"
   PREFIX my: <http://www.codeproject.com/KB/recipes/n3_notation#>
   SELECT ?name WHERE { [ a my:spec; my:preferedby my:@variable;  my:name ?name].  }";
   queryString.SetVariable("variable", preference );

我不能在SetVariable函数的第二个参数中设置变量preference,因为它说这是一个无效的参数。我在文件中读到,参数必须是一个INode值,我试图获得变量preference的INode值使用

INode value = preference.Value("var");

,但它不能这样做,因为它显示一个错误" String does not contain a definition for value"

可以有人帮我得到这个字符串变量的INode值或如何正确调用SetVariable方法

传递一个变量给SparqlParameterizedString dotNetRDF

首先,你的查询模板看起来很糟糕,你有my:@variable,这只会导致无效的查询,无论你注入什么值。另外,@variable是一个参数,必须通过SetParameter()SetUri()SetLiteral()方法之一注入。

看起来你实际上想要注入的是URI <http://www.codeproject.com/KB/recipes/n3_notation#foo>,其中foo是你的d1.send()方法返回的字符串。并且你正在尝试使用PREFIX声明将其压缩为my:foo

所以如果你想注入一个URI,那么你可以直接使用SetUri(),例如

// Start a new query string
SparqlParameterizedString queryString = new SparqlParameterizedString();
// Set the desired prefix declarations
queryString.Namespaces.AddNamespace("my", new Uri("http://www.codeproject.com/KB/recipes/n3_notation#"));
// Set the command template
queryString.CommandText = @"SELECT ?name WHERE 
{ 
  [ a my:spec ; 
    my:preferedby @variable ;  
    my:name ?name ].  
}";
// Set your parameter
queryString.SetUri("variable", new Uri("http://www.codeproject.com/KB/recipes/n3_notation#" + preference));