2

我正在玩一些 Dotnetrdf 的 sparql 引擎,我正在尝试创建参数化查询但尚未成功。

假设我正在处理带有标识为 _:1690 的空白节点的图 g,其代码

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 属性,而不是仅在我的空白节点上过滤结果。

请问,如何正确设置参数的值,以便我在结果中只得到一项?

在此先感谢,马克斯。

4

1 回答 1

0

SPARQL 查询中的空白节点与 RDF 图中的空白节点不同

在 SPARQL 查询中,空白节点被视为具有有限范围的临时变量,它与特定的空白节点不匹配,因此您无法编写 SPARQL 查询以通过空白节点标识符进行选择。

因此,您创建查询的代码给出的结果与您@context用变量替换的结果相同,例如?s

如果您需要找到与特定空白节点关联的值,那么您需要制定一个查询,根据它参与的三元组唯一地选择该空白节点。如果您不能这样做,那么您需要重新考虑您的数据建模,因为如果是这种情况,那么您可能应该使用 URI 而不是空白节点。


作为一种解决方法,因为您使用的是 dotNetRDF 并拥有要查询的原始图形,因此您可以使用IGraphAPI,例如

INode label = g.GetTriplesWithSubjectPredicate(g.GetBlankNode("1690"), g.CreateUriNode("rdfs:label")).Select(t => t.Object).FirstOrDefault();

请记住,label如果您要查找的三元组不存在,则它可能始终为空

于 2013-04-17T18:51:52.447 回答