datomic

Ask questions on the official Q&A site at https://ask.datomic.com!
zilti 2020-10-09T11:52:25.412500Z

Is there a way to query for entities that don't have a certain attribute? Something like "show me all entities that have a :company/id but don't have a :company/owner"

2020-10-09T11:53:40.412800Z

Check out missing? in the query docs

2👍
souenzzo 2020-10-09T13:59:35.413800Z

@zilti you can also do

[?e .....]
(not [?e :attr])

3👍
souenzzo 2020-10-09T19:33:37.416600Z

Looks like that datomic-peer do not respect socks proxy JVM props -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=5000 Is it a know issue? slurp respect this settings both for dns resolution and packages. Datomic do not respect the proxy for names resolution I can't know about packages

Chicão 2020-10-09T20:33:34.419300Z

Hi, I want to restore my backup db then I run bin/transctor the transactor

datomic-pro-0.9.5561 bin/transactor config/dev-transactor-template.properties
Launching with Java options -server -Xms1g -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=50
Starting datomic:<dev://localhost:4334/&lt;DB-NAME>&gt;, storing data in: data ...
System started datomic:<dev://localhost:4334/&lt;DB-NAME>&gt;, storing data in: data
and I ran this command and I got an error
datomic-pro-0.9.5561 bin/datomic restore-db backup.tgz datomic:<dev://localhost:4334/hummingbirg-dev>                                                                                        
java.lang.IllegalArgumentException: :storage/invalid-uri Unsupported protocol:
        at datomic.error$arg.invokeStatic(error.clj:57)
        at datomic.error$arg.invoke(error.clj:52)
        at datomic.error$arg.invokeStatic(error.clj:55)
        at datomic.error$arg.invoke(error.clj:52)
        at datomic.backup$fn__19707.invokeStatic(backup.clj:306)
        at datomic.backup$fn__19707.invoke(backup.clj:304)
        at clojure.lang.MultiFn.invoke(MultiFn.java:233)
Can someone help me?

marshall 2020-10-09T20:34:31.419700Z

your backup (source) needs to be an unzipped backup, not a tar

Chicão 2020-10-09T20:35:06.420100Z

I got the same error when I unzipped

marshall 2020-10-09T20:35:19.420300Z

untarred/unzipped

marshall 2020-10-09T20:35:23.420500Z

it should be a directory

marshall 2020-10-09T20:36:29.421Z

a top level dir with roots and values dirs inside of it

Chicão 2020-10-09T20:38:02.421300Z

backup ls
owner  roots  values

marshall 2020-10-09T20:38:17.421500Z

ah

marshall 2020-10-09T20:38:22.421800Z

you need to make a URI for it

marshall 2020-10-09T20:38:23.421900Z

sorry

marshall 2020-10-09T20:38:38.422300Z

it will be like: file:///User/Home/backup/

Chicão 2020-10-09T20:42:03.423Z

it worked

Chicão 2020-10-09T20:42:08.423200Z

thanks !

marshall 2020-10-09T20:42:11.423400Z

no problem

2020-10-09T20:42:33.423500Z

I'm now debugging this 401 issue in my own case, where Datomic fails to download consistently on Github Actions for CI purposes but not locally on my machine.

zilti 2020-10-09T22:35:28.426700Z

Okay, I don't get it... or-join works completely different from what I expect. When there's no result fulfilling any of the clauses in or-join it will match everything. Is that on purpose? How can I avoid that?

zilti 2020-10-09T22:53:14.427100Z

I thought this:

(d/q '[:find ?eid .
       :in $ ?comp-domain ?comp-name
       :where
       (or-join [?eid]
                [?eid :company/name ?comp-name]
                [?eid :company/domain ?comp-domain])]
     db comp-domain (:company/name data)))
Would be equivalent to this:
(or (d/q '[:find ?eid .
       :in $ ?comp-domain ?comp-name
       :where
       [?eid :company/domain ?comp-domain]]
     db comp-domain))
     (d/q '[:find ?eid .
       :in $ ?comp-domain ?comp-name
       :where
       [?eid :company/name ?comp-name]]
     db (:company/name data))))
But it is not.

2020-10-09T22:57:34.427200Z

In the first query, you are getting all ?eid s because the or-join you specify does not unify with ?comp-name nor ?comp-domain. So, practically, the ?comp-domain/`?comp-name` in your :in clause are not the same as the ones you use in the or branches of your or-join

2020-10-09T22:58:42.427400Z

So your first query now says “Give me al entity ids of entities that have either a name, or a domain”, the bindings in your :in make no difference

2020-10-09T22:59:55.427600Z

If you change (or-join [?eid] ...) to (or-join [?eid ?comp-domain ?comp-name] ...), do you get what you want?

zilti 2020-10-09T23:00:49.427900Z

I'm trying...

zilti 2020-10-09T23:01:23.428100Z

Yes, that gives me an empty result, which is correct in this case

zilti 2020-10-09T23:02:41.428300Z

And it works for a valid binding too. Thanks! I misinterpreted how that first vector works in or-join, I thought that is to declare the common variable.

steveb8n 2020-10-09T23:03:47.429400Z

Q: what’s the best way to query for the most recently created entity (with other conditions) in Datalog?

2020-10-09T23:03:50.429500Z

It declares what variables from outside the or-join to unify with ^^

steveb8n 2020-10-09T23:04:22.429700Z

I can include a :where [?e :some/attr _ ?t] and then sort all results by ?t but it feels like there must be some way to use max to do this

zilti 2020-10-09T23:04:52.429900Z

🙂

2020-10-09T23:04:56.430100Z

Here are some interesting time rules: https://github.com/Datomic/day-of-datomic/blob/master/tutorial/time-rules.clj maybe that helps ^^

steveb8n 2020-10-09T23:06:02.430500Z

perfect! thank you 🙂

2020-10-09T23:08:13.430700Z

Not sure if your use is exactly in there, but I often use it as a reference if I want to find something history related 🙂

steveb8n 2020-10-09T23:08:47.430900Z

it’s a good start. I’ll be able to make it work from this

2020-10-09T23:09:23.431100Z

haha, teach a man to fish, and all 🙂

steveb8n 2020-10-09T23:09:37.431300Z

exactly. you supplied the bait