[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