dotnetrdf - Retrieving Specific RDF Graph Triples Based on Predicate Nodes -
i using dotnetrdf send sparql construct
query , evaluate resulting igraph
.
for start, trying find uri nodes represent individuals of given type, say,
http://www.example.com/interestingthing
so, use gettripleswithpredicateobject
method, passing http://www.w3.org/1999/02/22-rdf-syntax-ns#type
predicate , http://www.example.com/interestingthing
object. method expects 2 objects implementing inode
interface, trying find respective nodes graph's geturinode
method.
problem: predicate not found.
when looking @ igraph
object in debugger, seems geturinode
can find contained in nodes
enumeration of graph - , contains uri nodes have been used subjects or objects, none used predicates.
now, predicate uri nodes evidently there - can see them when exploring triples
object of graph. appear in triple
instances can retrieved directly object, , can found in predicatenodes
property of same object.
interestingly, querying methods of igraph
such gettripleswithobject
or gettripleswithpredicate
have overloads accept mere uri
instead of inode
- gettripleswithpredicateobject
not.
now, various possible workarounds obvious:
- use overload of
gettripleswithpredicate
takesuri
instance, filter resulting triples manually. - manually search through triples desired triples.
- manually search through list of
predicatenodes
, find ones searched uris.
all of these seem unnecessarily cumbersome, though - existing methods suggest @ first glance 1 should able use geturinode
retrieve 2 nodes , pass 1 of ready-made querying methods such gettripleswithobjectpredicate
.
therefore, question is:
am missing anything, either in dotnetrdf library or conceptually, in rdf, or behavior obstacles poses developers design?
here c# test case reproduce problem (querying dbpedia):
using system; using system.collections.generic; using system.linq; using vds.rdf; using vds.rdf.query; namespace test { class program { public static void main(string[] args) { // querying // entries analyze declared belong temporary type, , // 2 properties mapped temporary property identifiers. console.writeline(); var endpoint = new sparqlremoteendpoint(new uri("http://dbpedia.org/sparql")); string query = "prefix dbpedia-owl: <http://dbpedia.org/ontology/>\n" + "prefix ex: <http://www.example.com/>\n" + "\n" + "construct {\n" + " ?r ex:record.\n" + " ?r ex:prop1 ?v1.\n" + " ?r ex:prop2 ?v2.\n" + "}\n" + "where {\n" + " {\n" + " select ?r\n" + " {\n" + " ?r dbpedia-owl:work.\n" + " filter(exists { ?r dbpedia-owl:originallanguage [] } && exists { ?r dbpedia-owl:author/dbpedia-owl:birthplace [] }).\n" + " } limit 5\n" + " }\n" + " ?r dbpedia-owl:originallanguage ?v1.\n" + " ?r dbpedia-owl:author/dbpedia-owl:birthplace ?v2.\n" + "}"; console.writeline(query); console.writeline(); igraph graph = endpoint.querywithresultgraph(query); printnodes("igraph.nodes", graph.nodes); console.writeline("all triples igraph.triples:"); foreach (var triple in graph.triples) { console.writeline("- s: " + nodetostring(triple.subject)); console.writeline(" p: " + nodetostring(triple.predicate)); console.writeline(" o: " + nodetostring(triple.object)); } console.writeline(); printnodes("igraph.triples.subjectnodes", graph.triples.subjectnodes); printnodes("igraph.triples.predicatenodes", graph.triples.predicatenodes); printnodes("igraph.triples.objectnodes", graph.triples.objectnodes); // graph analysis // following code tries retrieve items of temporary // type "record". var typenode = tryfindurinode(graph, new uri(namespacemapper.rdf + "type")); var recordnode = tryfindurinode(graph, new uri("http://www.example.com/record")); console.writeline(); tryfindallnodes("subjects", graph, graph.triples.subjectnodes.oftype<iurinode>().select(node => node.uri)); tryfindallnodes("predicates", graph, graph.triples.predicatenodes.oftype<iurinode>().select(node => node.uri)); tryfindallnodes("objects", graph, graph.triples.objectnodes.oftype<iurinode>().select(node => node.uri)); console.writeline(); var createdtypenode = graph.createurinode(new uri(namespacemapper.rdf + "type")); var createdrecordnode = graph.createurinode(new uri("http://www.example.com/record")); if ((typenode != null) && (recordnode != null)) { console.writeline("{0} triple(s) found predicate , found object.", graph.gettripleswithpredicateobject(typenode, recordnode).count()); } if (typenode != null) { console.writeline("{0} triple(s) found predicate , created object.", graph.gettripleswithpredicateobject(typenode, createdrecordnode).count()); } if (recordnode != null) { console.writeline("{0} triple(s) created predicate , found object.", graph.gettripleswithpredicateobject(createdtypenode, recordnode).count()); } console.writeline("{0} triple(s) created predicate , created object.", graph.gettripleswithpredicateobject(createdtypenode, createdrecordnode).count()); } private static string nodetostring(inode node) { return string.format("{0} ({1})", node, node.gettype().name); } private static void printnodes(string title, ienumerable<inode> nodes) { console.writeline(title + ":"); foreach (var node in nodes) { console.writeline("- " + nodetostring(node)); } console.writeline(); } private static inode tryfindurinode(igraph graph, uri uri) { var result = graph.geturinode(uri); if (result == null) { console.writeline(uri.tostring() + " not found igraph.geturinode."); } else { console.writeline(uri.tostring() + " found igraph.geturinode."); } return result; } private static void tryfindallnodes(string title, igraph graph, ienumerable<uri> uris) { console.writeline("trying find " + title + ":"); foreach (uri uri in uris) { tryfindurinode(graph, uri); } } } }
this output of sample program:
prefix dbpedia-owl: <http://dbpedia.org/ontology/> prefix ex: <http://www.example.com/> construct { ?r ex:record. ?r ex:prop1 ?v1. ?r ex:prop2 ?v2. } { { select ?r { ?r dbpedia-owl:work. filter(exists { ?r dbpedia-owl:originallanguage [] } && exists { ?r dbpedia-owl:author/dbpedia-owl:birthplace [] }). } limit 5 } ?r dbpedia-owl:originallanguage ?v1. ?r dbpedia-owl:author/dbpedia-owl:birthplace ?v2. } igraph.nodes: - http://dbpedia.org/resource/electra_(sophocles) (urinode) - http://dbpedia.org/resource/peer_gynt (urinode) - http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) - http://dbpedia.org/resource/the_field (urinode) - http://dbpedia.org/resource/the_lady_from_the_sea (urinode) - http://www.example.com/record (urinode) - http://dbpedia.org/resource/ancient_greek (urinode) - http://dbpedia.org/resource/colonus (urinode) - http://dbpedia.org/resource/norwegian_language (urinode) - http://dbpedia.org/resource/skien (urinode) - http://dbpedia.org/resource/norway (urinode) - http://dbpedia.org/resource/czech_language (urinode) - http://dbpedia.org/resource/kingdom_of_bohemia (urinode) - http://dbpedia.org/resource/bohemia (urinode) - http://dbpedia.org/resource/mal%c3%a9_svato%c5%88ovice (urinode) - http://dbpedia.org/resource/austria-hungary (urinode) - http://dbpedia.org/resource/english_language (urinode) - http://dbpedia.org/resource/irish_free_state (urinode) - http://dbpedia.org/resource/listowel (urinode) - http://dbpedia.org/resource/county_kerry (urinode) triples igraph.triples: - s: http://dbpedia.org/resource/electra_(sophocles) (urinode) p: http://www.w3.org/1999/02/22-rdf-syntax-ns#type (urinode) o: http://www.example.com/record (urinode) - s: http://dbpedia.org/resource/electra_(sophocles) (urinode) p: http://www.example.com/prop1 (urinode) o: http://dbpedia.org/resource/ancient_greek (urinode) - s: http://dbpedia.org/resource/electra_(sophocles) (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/colonus (urinode) - s: http://dbpedia.org/resource/peer_gynt (urinode) p: http://www.w3.org/1999/02/22-rdf-syntax-ns#type (urinode) o: http://www.example.com/record (urinode) - s: http://dbpedia.org/resource/peer_gynt (urinode) p: http://www.example.com/prop1 (urinode) o: http://dbpedia.org/resource/norwegian_language (urinode) - s: http://dbpedia.org/resource/peer_gynt (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/skien (urinode) - s: http://dbpedia.org/resource/peer_gynt (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/norway (urinode) - s: http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) p: http://www.w3.org/1999/02/22-rdf-syntax-ns#type (urinode) o: http://www.example.com/record (urinode) - s: http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) p: http://www.example.com/prop1 (urinode) o: http://dbpedia.org/resource/czech_language (urinode) - s: http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/kingdom_of_bohemia (urinode) - s: http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/bohemia (urinode) - s: http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/mal%c3%a9_svato%c5%88ovice (urinode) - s: http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/austria-hungary (urinode) - s: http://dbpedia.org/resource/the_field (urinode) p: http://www.w3.org/1999/02/22-rdf-syntax-ns#type (urinode) o: http://www.example.com/record (urinode) - s: http://dbpedia.org/resource/the_field (urinode) p: http://www.example.com/prop1 (urinode) o: http://dbpedia.org/resource/english_language (urinode) - s: http://dbpedia.org/resource/the_field (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/irish_free_state (urinode) - s: http://dbpedia.org/resource/the_field (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/listowel (urinode) - s: http://dbpedia.org/resource/the_field (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/county_kerry (urinode) - s: http://dbpedia.org/resource/the_lady_from_the_sea (urinode) p: http://www.w3.org/1999/02/22-rdf-syntax-ns#type (urinode) o: http://www.example.com/record (urinode) - s: http://dbpedia.org/resource/the_lady_from_the_sea (urinode) p: http://www.example.com/prop1 (urinode) o: http://dbpedia.org/resource/norwegian_language (urinode) - s: http://dbpedia.org/resource/the_lady_from_the_sea (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/skien (urinode) - s: http://dbpedia.org/resource/the_lady_from_the_sea (urinode) p: http://www.example.com/prop2 (urinode) o: http://dbpedia.org/resource/norway (urinode) igraph.triples.subjectnodes: - http://dbpedia.org/resource/electra_(sophocles) (urinode) - http://dbpedia.org/resource/peer_gynt (urinode) - http://dbpedia.org/resource/pictures_from_the_insects'_life (urinode) - http://dbpedia.org/resource/the_field (urinode) - http://dbpedia.org/resource/the_lady_from_the_sea (urinode) igraph.triples.predicatenodes: - http://www.w3.org/1999/02/22-rdf-syntax-ns#type (urinode) - http://www.example.com/prop1 (urinode) - http://www.example.com/prop2 (urinode) igraph.triples.objectnodes: - http://www.example.com/record (urinode) - http://dbpedia.org/resource/ancient_greek (urinode) - http://dbpedia.org/resource/colonus (urinode) - http://dbpedia.org/resource/norwegian_language (urinode) - http://dbpedia.org/resource/skien (urinode) - http://dbpedia.org/resource/norway (urinode) - http://dbpedia.org/resource/czech_language (urinode) - http://dbpedia.org/resource/kingdom_of_bohemia (urinode) - http://dbpedia.org/resource/bohemia (urinode) - http://dbpedia.org/resource/mal%c3%a9_svato%c5%88ovice (urinode) - http://dbpedia.org/resource/austria-hungary (urinode) - http://dbpedia.org/resource/english_language (urinode) - http://dbpedia.org/resource/irish_free_state (urinode) - http://dbpedia.org/resource/listowel (urinode) - http://dbpedia.org/resource/county_kerry (urinode) trying find subjects: http://dbpedia.org/resource/electra_(sophocles) found igraph.geturinode. http://dbpedia.org/resource/peer_gynt found igraph.geturinode. http://dbpedia.org/resource/pictures_from_the_insects'_life found igraph.geturinode. http://dbpedia.org/resource/the_field found igraph.geturinode. http://dbpedia.org/resource/the_lady_from_the_sea found igraph.geturinode. trying find predicates: http://www.w3.org/1999/02/22-rdf-syntax-ns#type not found igraph.geturinode. http://www.example.com/prop1 not found igraph.geturinode. http://www.example.com/prop2 not found igraph.geturinode. trying find objects: http://www.example.com/record found igraph.geturinode. http://dbpedia.org/resource/ancient_greek found igraph.geturinode. http://dbpedia.org/resource/colonus found igraph.geturinode. http://dbpedia.org/resource/norwegian_language found igraph.geturinode. http://dbpedia.org/resource/skien found igraph.geturinode. http://dbpedia.org/resource/norway found igraph.geturinode. http://dbpedia.org/resource/czech_language found igraph.geturinode. http://dbpedia.org/resource/kingdom_of_bohemia found igraph.geturinode. http://dbpedia.org/resource/bohemia found igraph.geturinode. http://dbpedia.org/resource/mal‚_svatonovice found igraph.geturinode. http://dbpedia.org/resource/austria-hungary found igraph.geturinode. http://dbpedia.org/resource/english_language found igraph.geturinode. http://dbpedia.org/resource/irish_free_state found igraph.geturinode. http://dbpedia.org/resource/listowel found igraph.geturinode. http://dbpedia.org/resource/county_kerry found igraph.geturinode. http://www.w3.org/1999/02/22-rdf-syntax-ns#type not found igraph.geturinode. http://www.example.com/record found igraph.geturinode. 5 triple(s) created predicate , found object. 5 triple(s) created predicate , created object.
as can seen, igraph.nodes
enumeration not include predicate uris such http://www.example.com/prop1
or http://www.w3.org/1999/02/22-rdf-syntax-ns#type
. likewise, output shows predicates not found geturinode
, while subjects , objects are.
you can use createurinode inodefactory (which igraph
extends) create rdf:type
node, , have like:
graph.gettripleswithpredicateobject( graph.createurinode( urifactory.createuri( "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" )), , graph.createurinode( urifactory.createuri( "http://www.example.com/interestingthing" )) )
this similar approach i'd take in jena, i'd use resourcefactory.createproperty( http://...ns#type )
. (actually, jena has constant rdf.type
convenience i'd use, approach i'd use 1 wasn't defined constant ahead of time.)
Comments
Post a Comment