today I tried to verify if using a database instead of Pilog facts would
speed up my processing. While trying this, I stumbled over the
following. Suppose:

  (pool test)

  (class +Test +Entity)
  (rel id (+Ref +String))
  (rel src (+Ref +String))
  (rel tgt (+Ref +String))

  (new '(+Test) 'id "1"  'src A  'tgt B)     
  (new '(+Test) 'id "11"  'src B  'tgt "C")    
  (new '(+Test) 'id "111"  'src C  'tgt "D")    


  (? (db id +Test 1 @E) (show @E))

The last Pilog query will successively return three answers where I
thought to get only one. I understand, why 'db' will deliver three
results. But the question comes up, how I could formulate the query
using only exact matches!

Without this, the 'db' query would return similar matches that I have to
explicitely guarding against with e.g. 'equal' like this:

  (? (db id +Test "1" @E) (val @Id @E id) (equal @Id "1") (show @E))

But this would defeat the reason, why I tried to use a DB at all. I
hoped that accessing an Edge via an index would be faster than asking
Pilog to match against all its facts until it found a corresponding it
could unify against.

So could this be the reason that my DB solution of traversing all ways
thru a graph is a lot slower than using Pilog facts? Both are trying to
iterate over the same graph built by 362 edges. Whereas the Pilog facts
will allow for finding ca. 1000 ways per 1-2 seconds, the database
solution was canceled after some time, as it did not reach the first
1000 solutions before I lost my patience ;-)

Or is there any way to improve the performance of the DB? For instance
by only matching exactly in the db query for a certain edge?

Thanks and Ciao,

UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe

Reply via email to