[HN Gopher] Asami: A flexible graph store in Clojure
       ___________________________________________________________________
        
       Asami: A flexible graph store in Clojure
        
       Author : tosh
       Score  : 105 points
       Date   : 2022-11-16 12:19 UTC (2 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | worldsayshi wrote:
       | > schema-less
       | 
       | It's really good to see a scalable database that did schemas a
       | bit like typescript does types. Opt-in explicit schema, try to
       | infer schemas when possible and allow schema-less if I ask for
       | it.
       | 
       | Hmm, I suppose elasticsearch does have this.
        
         | quoll wrote:
         | Hmmm, I wouldn't call it _scalable_. The storage is pluggable
         | though, and it can be made to scale that way. But it holds a
         | lot of data locally, and seems to do a reasonable job.
         | "Loading" means indexing everything, so nothing is available
         | until the index is done, and that can take a few minutes if
         | you're trying to load GBs. However, it's usually very fast to
         | query. I don't have an explicit schema yet, though I'm working
         | on adding something like Datomic's schema as an option. (this
         | is important for things like upsert, or just updating entity
         | attributes instead of appending new attributes)
        
       | mark_l_watson wrote:
       | I just spent ten minutes looking through the repo. I like how the
       | query language is similar enough to Datomic's to have an easy
       | learning curve. I wish I could push a magic button and have this
       | in Common Lisp (where I usually just use SQLite as an easy to use
       | data store).
        
         | quoll wrote:
         | The main problem is that I don't have a lot of time on it right
         | now, though I'm trying to do more.
         | 
         | I don't actually know Common Lisp, though it seems to work
         | nicely when compiled to binary via Graal, so maybe there's some
         | possibilities of integration using that approach?
        
         | harryvederci wrote:
         | An idea that pops up more and more often in my head is to
         | create a SQLite wrapper library that basically treats SQLite
         | like Datalog.
         | 
         | I know way too little about Datalog, but it goes something like
         | this:
         | 
         | 1. create helper functions to create/alter/drop tables.
         | 
         | 2. create helper functions for insert/select/update/delete
         | queries, etc. Probably with the same syntax as in Datomic /
         | Asami / etc.
         | 
         | 3. each table its name would be a Datalog "attribute", and
         | would have 2 columns: the "id" and the "value". "id" would be
         | indexed, "value" would be a value or a foreign key to another
         | table.
         | 
         | I guess writes would be slow if everything you insert into the
         | DB is indexed, not sure what the other downsides would be.
        
           | dms92n1bx wrote:
           | There is (now unmaintained) project called Mentat [0] from
           | Mozilla.
           | 
           | [0] https://github.com/mozilla/mentat
        
           | packetlost wrote:
           | It's not like datomic claims to be lightening fast, it's not.
           | The real problem is if you want to support the historical
           | queries "as_of()", which is very difficult to do efficiently
           | with only B-tree indexes. So you're either left maintaining
           | your own indices as tables or externalizing it to something
           | else. I think the latter would actually be a pretty ok option
           | if your dataset fits entirely in memory (though... for
           | historical queries it will grow much faster than a normal
           | database).
           | 
           | Regardless, I have a partial attempted implementation of this
           | on top of SQLite using Python:
           | https://git.sr.ht/~chiefnoah/quark
           | 
           | No query engine, I didn't get that far.
        
             | harryvederci wrote:
             | I'm talking about Datalog, I mentioned Datomic purely in
             | the context of syntax.
             | 
             | And to sum up what I know about Datalog, it's basically
             | just this article (not reference material, but it got me
             | interested in the concept), plus some light wikipedia-ing:
             | https://www.instantdb.com/essays/datalogjs
             | 
             | Edit: I think you added the part with your git repo after I
             | wrote this. Looks cool, could you add a license file to it?
        
               | packetlost wrote:
               | Got it. Yeah, datalog is cool. I really like it (if that
               | wasn't obvious from my attempt at implementing it). While
               | not built on SQLite, this project has caught my attention
               | recently: https://github.com/cozodb/cozo
               | 
               | It's built on RocksDB and has slightly different query
               | syntax (supposedly to be more similar to Python's, as a
               | primary target usecase is within Jupyter notebooks).
               | Check it out!
        
             | quoll wrote:
             | Not sure what you mean here? as_of() is easy to do
             | efficiently, so long as you have tree indexes (it doesn't
             | _really_ matter what type of tree, though fractal trees
             | would not be good). But you need direct access to the tree,
             | rather than having an index that 's built using a tree,
             | since then you can't build the phases.
        
               | packetlost wrote:
               | Right, if you have direct access to the tree it's
               | possible and not really inefficient at all (a modified
               | B+Tree would be my first pick, but I digress). Part of my
               | problem was I was trying to offload as much of the work
               | to SQLite as possible. I think if I were to go back and
               | try again, I would make it a bit further :)
        
           | michaelsbradley wrote:
           | Did you see the Show HN post announcing cozo 10 days ago?
           | 
           | https://news.ycombinator.com/item?id=33518320
           | 
           | https://github.com/cozodb/cozo
           | 
           | Note: there was a fair amount of discussion about the
           | license; the author eventually switched it to MPL2.
        
         | fiddlerwoaroof wrote:
         | Do you happen to know of any good resources for implementing
         | datalog? I've thought about writing something similar in Common
         | Lisp several times, but it's hard to find a good introduction
         | here.
        
       ___________________________________________________________________
       (page generated 2022-11-18 23:01 UTC)