- From: Dau, Frithjof <frithjof.dau@sap.com>
- Date: Fri, 12 Jun 2009 17:51:23 +0200
- To: "Samuel Pedro" <samuelcpspam@gmail.com>, "Stephane Corlosquet" <scorlosquet@gmail.com>, "Lee Feigenbaum" <lee@thefigtrees.net>, <public-sparql-dev@w3.org>
- Message-ID: <EDFFA9D51148B34FAA0B828A82AAE70C022B9593@dewdfe1g.wdf.sap.corp>
Hi Samuel, with SPARQL you can essentially query subgraphs of a given graph. In your "OWL-graph", you have a node "...#Meat". With SPARQL, you can query other nodes and the properties which relate these nodes to you "...#Meat"-node. Anyhow, the only property which relates your "...#Meat"-node to ther nodes is the "rdfs:subClassOf"-property, relating your "...#Meat"-node to its super- and subclasses (depending on whether your "...#Meat"-node is the subject or object of a (x rdfs:subClassOf y) triple). I guess what you have in mind is something like: The class is called "Meat", so let's query for that name. Nope, does not work. The name of the class is a part of the node-URI, and you cannot query parts of these -let's say- URI-string. So, if you want to query classes by its names, you *must* make the name in the ontology explicit by using a property. The most common approach is the "rdfs:label"-attribute. Iy you use it -and you do it for your "...#Pig"-class, you explicitely relate the name "Pig" (a literal) to the class by the rdfs:label-property. Now you have the situation that the class is linked to its name by use of nodes and properties, and thus you can query it. I sugges you have a look at your ontology with an RDF-visualizer (like IsaViz), keep in mind that you can only query for graph patterns, and then you will hopefully understand why your initial query does not work. Cheers Frithjof ________________________________ Von: public-sparql-dev-request@w3.org [mailto:public-sparql-dev-request@w3.org] Im Auftrag von Samuel Pedro Gesendet: Freitag, 12. Juni 2009 17:35 An: Stephane Corlosquet; Lee Feigenbaum; public-sparql-dev@w3.org Betreff: Re: Sparql query help Ok, tried to send as a attachment but probably something went wrong, i will post here: <?xml version="1.0"?> <rdf:RDF xmlns:xsp="http://www.owl-ontologies.com/2005/08/07/xsp.owl#" xmlns="http://www.owl-ontologies.com/testFood2.owl#" xmlns:swrlb="http://www.w3.org/2003/11/swrlb#" xmlns:swrl="http://www.w3.org/2003/11/swrl#" xmlns:protege="http://protege.stanford.edu/plugins/owl/protege#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xml:base="http://www.owl-ontologies.com/testFood2.owl"> <owl:Ontology rdf:about=""/> <owl:Class rdf:ID="Cow"> <rdfs:subClassOf> <owl:Class rdf:ID="RedMeat"/> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:ID="Chicken"> <rdfs:subClassOf> <owl:Class rdf:ID="WhiteMeat"/> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:ID="Pig2"> <owl:equivalentClass> <owl:Class rdf:ID="Pig"/> </owl:equivalentClass> <rdfs:subClassOf> <owl:Class rdf:about="#RedMeat"/> </rdfs:subClassOf> <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >Pig2</rdfs:label> </owl:Class> <owl:Class rdf:ID="Onion"> <rdfs:subClassOf> <owl:Class rdf:ID="Vegetable"/> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:ID="Ingredients"/> <owl:Class rdf:about="#Pig"> <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string" >Pig</rdfs:label> <rdfs:subClassOf> <owl:Class rdf:about="#RedMeat"/> </rdfs:subClassOf> <owl:equivalentClass rdf:resource="#Pig2"/> </owl:Class> <owl:Class rdf:ID="ChickenWithTomato"> <rdfs:subClassOf> <owl:Class rdf:ID="Plates"/> </rdfs:subClassOf> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty> <owl:ObjectProperty rdf:ID="hasIngridients"/> </owl:onProperty> <owl:someValuesFrom> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="#Chicken"/> <owl:Class rdf:ID="Tomato"/> </owl:intersectionOf> </owl:Class> </owl:someValuesFrom> </owl:Restriction> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:ID="ChickenWithOnions"> <rdfs:subClassOf rdf:resource="#Plates"/> <rdfs:subClassOf> <owl:Restriction> <owl:onProperty rdf:resource="#hasIngridients"/> <owl:someValuesFrom> <owl:Class> <owl:intersectionOf rdf:parseType="Collection"> <owl:Class rdf:about="#Chicken"/> <owl:Class rdf:about="#Onion"/> </owl:intersectionOf> </owl:Class> </owl:someValuesFrom> </owl:Restriction> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="#WhiteMeat"> <rdfs:subClassOf> <owl:Class rdf:ID="Meat"/> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="#Tomato"> <rdfs:subClassOf> <owl:Class rdf:about="#Vegetable"/> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="#RedMeat"> <rdfs:subClassOf> <owl:Class rdf:about="#Meat"/> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:about="#Vegetable"> <rdfs:subClassOf rdf:resource="#Ingredients"/> </owl:Class> <owl:Class rdf:about="#Meat"> <rdfs:subClassOf rdf:resource="#Ingredients"/> </owl:Class> <owl:ObjectProperty rdf:ID="hasChicken"> <rdfs:subPropertyOf> <owl:ObjectProperty rdf:ID="hasWhiteMeat"/> </rdfs:subPropertyOf> </owl:ObjectProperty> <owl:ObjectProperty rdf:ID="hasMeat"> <rdfs:subPropertyOf rdf:resource="#hasIngridients"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:ID="hasVegetable"> <rdfs:subPropertyOf rdf:resource="#hasIngridients"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:ID="hasIngridients_26"> <rdfs:subPropertyOf rdf:resource="#hasIngridients"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:ID="hasOnion"> <rdfs:subPropertyOf rdf:resource="#hasVegetable"/> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="#hasWhiteMeat"> <rdfs:subPropertyOf rdf:resource="#hasMeat"/> </owl:ObjectProperty> </rdf:RDF> But think that i understand why it cant work that way. "but I think it's pretty likely that your classes are resources (URIs)" how i know that? 2009/6/12 Stephane Corlosquet <scorlosquet@gmail.com> Hi Samuel, You cannot use ?meatClass owl:Class "Pig" in your WHERE clause because it is not a valid pattern. You should follow the {subject property object} pattern in your WHERE clause. owl:Class is a class and not a property. Stephane. On Fri, Jun 12, 2009 at 3:52 PM, Samuel Pedro <samuelcpspam@gmail.com> wrote: This is my owl file, i had to add labels to the classes, and do this: SELECT ?equivalentClass ?meatClass WHERE { ?equivalentClass owl:equivalentClass ?meatClass . ?meatClass rdfs:label "Pig" . (in owl file i have Pig and Pig2) } and why this query doesnt work, why it only works for labels? (I'm trying to understand sparql but...) SELECT ?equivalentClass ?meatClass WHERE { ?equivalentClass owl:equivalentClass ?meatClass . ?meatClass owl:Class "Pig" . } 2009/6/12 Lee Feigenbaum <lee@thefigtrees.net> Samuel Pedro wrote: Im trying to do this query... SELECT ?subject ?object WHERE { ?subject owl:equivalenteClass ?object FILTER( ?object = "Meat") } im trying to find the equivalente Class of meat, but it doesn't return what i want, what am i doing wrong? if i do this... SELECT ?subject ?object WHERE { ?subject owl:equivalenteClass ?object FILTER( ?object != "Meat") } i get all the equivalent class that there is in the owl. why? Without seeing your data, it's hard to say for sure, but I think it's pretty likely that your classes are resources (URIs) and "Meat" is just a label for the class. If this is right, you probably want a query similar to: SELECT ?equivalentClass ?meatClass WHERE { ?equivalentClass owl:equivalentClass ?meatClass .. ?meatClass rdfs:label "Meat" . } The details will vary depending on what predicate is used to give a label to your classes (in my example I assume that it's rdfs:label). Also, note that the label needs to be exactly "Meat" for this to work. hope this helps, Lee -- -- Samuel Pedro
Received on Friday, 12 June 2009 16:16:54 UTC