[Nepomuk] Re: First problems with query API
Sebastian Trüg
trueg at kde.org
Wed Mar 2 12:22:11 CET 2011
On 03/02/2011 11:30 AM, Ignacio Serantes wrote:
> Hi!
>
> On Wed, Mar 2, 2011 at 10:00 AM, Sebastian Trüg <trueg at kde.org
> <mailto:trueg at kde.org>> wrote:
>
> Good to know.
>
>
> Yes, sure :)
>
>
> For now simply put the query term in a single LiteralTerm:
>
> LiteralTerm("hello world this is several terms")
>
> That will do it.
>
> Your problem is that what you wrote with the query API is not what you
> meant.
>
> AndTerm( LiteralTerm("A"), LiteralTerm("B") )
>
> will look for all resources that have term "A" in any property value and
> term "B" in any property value. What you want (and do in your query) is
> looking for all resources that have a properly value that contains "A"
> and "B". See the difference? Using 6 LiteralTerms gets you a really big
> join.
>
>
> No, I precisely I'm trying that you mean. I look for all resources that
> have term "A" in any property, etc... as my query does in a limited
> manner. I have several asian names in my db "ha ji won", "kim sa rang",
> 'lee dae hae", "uhm ji won", etc... and even this Asian names could be
> writen in several manners: Yūko, Yuuko, Yuko, ゆうこ, 裕子, etc... so I
> could need this kind of queries.
>
> I will work this night your queries because I think that can be improved.
So you actually want this:
select ?r where { { ?r ?p1 ?v1 . ?v1 bif:contains "A" . } UNION { ?r ?p2
?v2 . ?v2 bif:contains "B" . } UNION { ?r ?p3 ?v3 . ?v3 ... } . }"
? Are you sure?
Cheers,
Sebastian
>
>
> Cheers,
> Sebastian
>
> On 03/01/2011 11:05 PM, Ignacio Serantes wrote:
> > Hi!
> >
> > As Sebastian suggested I tried the search API without my dirty
> hack and
> > I finally learn how to use it. This is my first successful code:
> >
> > term =
> > Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("música",
> > 'UTF-8')))
> > query = Nepomuk.Query.Query(term)
> > [code #1]
> >
> query.addRequestProperty(Nepomuk.Query.Query.RequestProperty(Nepomuk.Types.Property(NEO('nie#url',
> > True))))
> >
> query.addRequestProperty(Nepomuk.Query.Query.RequestProperty(Nepomuk.Types.Property(NEO('nao#prefLabel',
> > True))))
> > sparqlQuery = query.toSparqlQuery()
> > model = Nepomuk.ResourceManager.instance().mainModel()
> > data = model.executeQuery(sparqlQuery,
> > Soprano.Query.QueryLanguageSparql)
> > ... < code to display result set > ...
> > [code #1]
> >
> >
> > The query is slow but works and columns url and prefLabel are
> available.
> > Great!
> > 896 results found in 7.69615888596 seconds
> >
> > I have a common query I used often when I'm developing "ha ji won
> kim sa
> > rang" because result set has one row (this is equivalent to write
> "'ha'
> > and 'ji' and 'won' and 'kim' and 'sa' and 'rang') and this is the
> result
> > set with a query generated by my builder nsSparqlBuilder.
> >
> > file:///media/HD1.5TB-01/video/corea/doramas/Secret Garden,
> [FileDataObject]
> > 1 results found in 1.21383500099 seconds.
> >
> > So I wrote the next code to test the API expecting same results:
> >
> > andTerm = Nepomuk.Query.AndTerm()
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ha",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ji",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("won",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("kim",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("sa",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("rang",
> > 'UTF-8'))))
> > query = Nepomuk.Query.Query(andTerm)
> > [code #1]
> >
> > and this is the result set I obtained:
> >
> > (iODBC Error: [OpenLink][Virtuoso iODBC Driver][Virtuoso Server]SQ200:
> > The memory pool size 400005656 reached the limit 400000000 bytes,
> try to
> > increase the MaxMemPoolSize ini setting)"
> > 0 results found in 85.3466908932 seconds
> >
> > Them I deleted two terms, the second and the five and there is no
> error
> > but result set is the next one:
> > 0 results found in 600.101149082 seconds
> >
> > Finally I discover that generated API queries works with two terms and
> > fails with more. For example, the next test is very slow but works:
> >
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ha",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ji",
> > 'UTF-8'))))
> >
> >
> > nepomuk:/res/c894d8fa-cb6a-4ab3-ab26-37a6abbe206e, , ha ji won
> > nepomuk:/res/c0642c10-6501-448c-a8ed-4992f45c232e,
> > file:///media/HD1.5TB-01/video/corea/doramas/Secret Garden,
> > 2 results found in 25.7656869888 seconds
> >
> > but the next one not:
> >
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ha",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ji",
> > 'UTF-8'))))
> >
> andTerm.addSubTerm(Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("won",
> > 'UTF-8'))))
> >
> >
> > and result is:
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > local socket error: QLocalSocket::SocketTimeoutError
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> > 0 results found in 1201.46248913 seconds
> > "" Soprano: "Command timed out."
> > "" Soprano: "Command timed out."
> >
> > In documentation there is no limit to the number of terms you can add
> > and even there is a constructor where you can add 6 terms. I tried it
> > but results are the same, the first term works but the second one not.
> >
> > term = Nepomuk.Query.AndTerm( \
> >
> Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ha",
> > 'UTF-8'))), \
> >
> Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ji",
> > 'UTF-8'))), \
> >
> > Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("won",
> 'UTF-8'))) \
> > )
> >
> > term = Nepomuk.Query.AndTerm( \
> >
> Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("ha",
> > 'UTF-8'))), \
> >
> > Nepomuk.Query.LiteralTerm(Soprano.LiteralValue(unicode("won",
> 'UTF-8'))) \
> > )
> >
> > On the other side using API if external hard drive is not mounted
> result
> > sets are empty. This behavior can be disabled?
> >
> > I only tried AndTerm but tomorrow I will try OrTerm if I have free
> time.
> >
> > --
> > Cheers,
> > Ignacio
> >
> >
> >
> >
> > _______________________________________________
> > Nepomuk mailing list
> > Nepomuk at kde.org <mailto:Nepomuk at kde.org>
> > https://mail.kde.org/mailman/listinfo/nepomuk
> _______________________________________________
> Nepomuk mailing list
> Nepomuk at kde.org <mailto:Nepomuk at kde.org>
> https://mail.kde.org/mailman/listinfo/nepomuk
>
>
>
>
> --
> Cheers,
> Ignacio
>
>
>
>
> _______________________________________________
> Nepomuk mailing list
> Nepomuk at kde.org
> https://mail.kde.org/mailman/listinfo/nepomuk
More information about the Nepomuk
mailing list