- From: Jitao Yang <jitao.yang@gmail.com>
- Date: Tue, 2 Jun 2009 17:08:30 +0200
- To: Yihong Ding <ding@cs.byu.edu>
- Cc: semantic-web@w3.org, www-rdf-interest@w3.org
- Message-ID: <eb1226bd0906020808g5f5c9733w499493cb6439e0b4@mail.gmail.com>
Dean Yihong, Thank you very much for your advice for using UNION, but in fact there is a difference between "?author dc:country ?country . " and "?author2 dc:country ?country2 ." when I use it in the query. On Tue, Jun 2, 2009 at 15:21, Yihong Ding <ding@cs.byu.edu> wrote: > sorry, a typo. > > there is not difference between "?author dc:country ?country . " or > "?author2 dc:country ?country2 ." > > > > > On Tue, Jun 2, 2009 at 9:19 AM, Yihong Ding <ding@cs.byu.edu> wrote: > >> Jitao, >> >> I have not totally checked your query. My impression is, however, that you >> have made the query unnecessarily complex in its logic. You have claimed too >> many free variables for a fairly simple request. Therefore, the entire logic >> just becomes nearly untraceable. In analogy, what you have done is to have >> used a dozen of "no"s in a sentence; to the end, nearly nobody really knows >> whether you mean "no" or "yes". >> >> In particular, please also be aware that in RDF and SPARQL, there is no >> difference between when you say "?author dc:country ?country . " or ?bookURI >> dc:author ?author2 ." There are too many ambiguities in your query. >> >> Just rewrite your query in the following way. >> >> return: all the books which have no authors UNION all the books which have >> authors while every author must have its country be Italy >> >> good luck, >> >> yihong >> >> >> >> >> >> >> On Tue, Jun 2, 2009 at 3:51 AM, Jitao Yang <jitao.yang@gmail.com> wrote: >> >>> Dear all, >>> >>> if I have an RDF file like: >>> >>> <?xml version="1.0" encoding="utf-8"?> >>> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" >>> xmlns:dc="http://purl.org/dc/elements/1.1/" >>> xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#"> >>> >>> <rdf:Description rdf:about="http://example.org/BookJava"> >>> <vcard:fullname>Book Java</vcard:fullname> >>> <dc:author> >>> <rdf:Description rdf:about=" >>> http://example.org/BookJava/authorA"> >>> <dc:fullname>Bob Smith</dc:fullname> >>> <dc:country>Italy</dc:country> >>> </rdf:Description> >>> </dc:author> >>> <dc:author> >>> <rdf:Description rdf:about=" >>> http://example.org/BookJava/authorB"> >>> <dc:fullname>Tom Bush</dc:fullname> >>> <dc:country>Italy</dc:country> >>> </rdf:Description> >>> </dc:author> >>> </rdf:Description> >>> >>> <rdf:Description rdf:about="http://example.org/BookCpp"> >>> <vcard:fullname>Book Cpp</vcard:fullname> >>> <dc:author> >>> <rdf:Description rdf:about=" >>> http://example.org/BookCpp/author2"> >>> <dc:fullname>Mike Luck</dc:fullname> >>> <dc:country>France</dc:country> >>> </rdf:Description> >>> </dc:author> >>> <dc:author> >>> <rdf:Description rdf:about=" >>> http://example.org/BookCpp/author1"> >>> <dc:fullname>Alice Bird</dc:fullname> >>> <dc:country>Italy</dc:country> >>> </rdf:Description> >>> </dc:author> >>> <dc:author> >>> <rdf:Description rdf:about=" >>> http://example.org/BookJava/authorB"> >>> <dc:fullname>kobe Mc</dc:fullname> >>> <dc:country>Italy</dc:country> >>> </rdf:Description> >>> </dc:author> >>> </rdf:Description> >>> >>> <rdf:Description rdf:about="http://example.org/BookC"> >>> <vcard:fullname>Book C</vcard:fullname> >>> </rdf:Description> >>> >>> </rdf:RDF> >>> >>> I want to query "the books whose authors are all Italian" or "the books >>> which have no authors", >>> so I use SPARQL like: >>> >>> PREFIX dc:<http://purl.org/dc/elements/1.1/> >>> PREFIX vcard:<http://www.w3.org/2001/vcard-rdf/3.0#> >>> SELECT DISTINCT ?bookName >>> WHERE { >>> ?bookURI vcard:fullname ?bookName . >>> OPTIONAL{ >>> ?bookURI dc:author ?author . >>> ?author dc:country ?country . >>> FILTER(?country = \"Italy\") . >>> OPTIONAL{ >>> ?bookURI dc:author ?author2 . >>> ?author2 dc:country ?country2 . >>> FILTER(?country2 != \"Italy\") >>> } >>> FILTER(bound(?country2)) >>> } >>> FILTER(!bound(?author)) >>> } >>> >>> I can get the right answers: >>> --------------- >>> | bookName | >>> =============== >>> | "Book C" | >>> | "Book Java" | >>> --------------- >>> but, my original idea is FILTER(!bound(?country2)) which means filter the >>> books which have non-Italian authors, >>> however if I use FILTER(!bound(?country2)), it will return the opposite >>> answers: >>> -------------- >>> | bookName | >>> ============== >>> | "Book C" | >>> | "Book Cpp" | >>> -------------- >>> I can not understand the reasons? >>> >>> Thank you very much for your help to explain to me. >>> >>> Best wishes, >>> Jitao >>> >> >> >> >> -- >> =================================== >> Yihong Ding >> >> http://yihongs-research.blogspot.com/ >> > > > > -- > =================================== > Yihong Ding > > http://yihongs-research.blogspot.com/ >
Received on Tuesday, 2 June 2009 15:09:31 UTC