Domanda

I'm playing around some with Dotnetrdf's sparql engine and I'm trying to create parametered queries with no success yet.

Say I'm working on a graph g with a blank node identified as _:1690 with the code

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))

Whenever I run this, I get all nodes having a rdfs:label property instead of filtering the result on my blank node only.

Please, how to set the parameter's value properly so I get only one item in the result ?

Thanks in advance, Max.

È stato utile?

Soluzione

Blank Nodes in a SPARQL query differ from Blank Nodes in a RDF Graph

In a SPARQL Query a blank node is treated as a temporary variable which has limited scope, it does not match a specific blank node so you cannot write a SPARQL query to select by blank node identifier.

So your code creating your query is giving a result the same as if you replaced @context with a variable e.g. ?s

If you need to find the value associated with a specific blank node then you need to formulate a query that uniquely selects that blank node based on the triples it participates in. If you can't do that then you need to re-think your data modelling since if this is the case then you should likely be using URIs instead of blank nodes.


As a workaround since you are using dotNetRDF and have the original graph you are querying you can use the IGraph API instead e.g.

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

Just remember that label could always be null if the triple you are looking for doesn't exist

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top