我正在玩Dotnetrdf的sparql引擎,我试图创建参数化查询但还没有成功。
说我正在处理图g,其中一个空白节点标识为_:1690,代码为
Dim queryString As SparqlParameterizedString = New SparqlParameterizedString()
queryString.Namespaces.AddNamespace("rdfs", UriFactory.Create("http://www.w3.org/2000/01/rdf-schema#"))
queryString.CommandText = "SELECT ?label { @context rdfs:label ?label } "
queryString.SetParameter("context", g.GetBlankNode("1690"))
Dim result As VDS.RDF.Query.SparqlResultSet = g.ExecuteQuery(New SparqlQueryParser().ParseFromString(queryString))
每当我运行它时,我得到所有节点都有一个rdfs:label属性,而不是只在我的空节点上过滤结果。
请问,如何正确设置参数值,以便我只得到结果中的一个项目?
提前致谢, 最大
答案 0 :(得分:0)
SPARQL查询中的空白节点与RDF图中的空白节点不同
在SPARQL查询中,空白节点被视为临时变量,其范围有限,与特定空白节点不匹配,因此您无法编写SPARQL查询以通过空白节点标识符进行选择。
因此,创建查询的代码给出的结果与将@context
替换为变量的结果相同,例如?s
如果您需要找到与特定空白节点关联的值,那么您需要根据其参与的三元组制定一个唯一选择该空白节点的查询。如果您不能这样做,则需要重新想想你的数据建模,因为如果是这种情况那么你应该使用URI而不是空白节点。
作为解决方法,因为您使用的是dotNetRDF并且拥有您要查询的原始图表,所以您可以使用IGraph
API,例如。
INode label = g.GetTriplesWithSubjectPredicate(g.GetBlankNode("1690"), g.CreateUriNode("rdfs:label")).Select(t => t.Object).FirstOrDefault();
请记住,如果您要查找的三元组不存在,label
可能始终为空