Here’s a spot for my query learning sprint log! I’ll be working on populating this with a proper plan tomorrow, but for now here’s a bit about why I’m here.
I started using Logseq about a month ago. I moved from Obsidian, where I was finding more friction that would be ideal in my workflow. I think, for me, Logseq is a better fit because (1) it operates with a journal as a homepage, whereas daily notes are an external plugin for Obsidian; and (2) queries are built-in, as opposed to by plugin (dataview) in Obsidian. It’s also a huge plus that Logseq is open source!
I think part of the reason #2 was such a big sticking point for me is that, before I used Obsidian, I was using Notion. I made extensive use of the databases and rollups available in Notion, but relying on the cloud was a dealbreaker for me. Notion had an outage one day and it basically destroyed my workflow that day, and a recent country-wide outage of Canada’s biggest telecom company reinforced my need for offline capabilities.
What made Notion click for me was learning how to use databases and rollups to make a recipe collection, grocery tracker, and meal planner that all worked together. I’ve been longing to have that back, so I’m hoping to develop a Logseq version over the next couple weeks, as well as streamlining my to-dos and note processing workflows.
Welcome to the forum an learning sprint @ashinonyx!
Logseq queries are not as easy as Notion’s point-and-click tables, but hopefully they’re just as powerful once you discover Datalog. Personally I hope that one day we’ll have a visual query builder tool that will rival Notion’s GUI.
Here’s my learning plan. I used Ramses’ and thatgothlibrarian’s learn logs as references when developing my own.
My goal: learn how to get the most out of Logseq by understanding what I can do with queries
I find the best way for me to learn new software is to build something that is useful to me and leverages some of the more complex abilities of that software. Queries seem to me like the most complex - and powerful - built-in feature of Logseq.
I’m still new to Logseq, so my overarching goal is to use this sprint to brainstorm what kinds of useful things I can build for myself with queries. But, since I also want to get some hands-on practice, I’m also going to be building something I used to have in Notion and loved: a recipe manager, grocery manager, and meal planner. The idea is to be able to use queries to see what I’ve liked in the past, what recipes use ingredients I have on-hand, what staple ingredients are low, what I need to buy this week, and more! I think this will need use for both simple queries and advanced queries.
My learning plan
What is my target performance level? What is good enough?
Good enough for recipe stuff: a system that I will actually want to use. It’s okay if it still needs some more work, as long as I have an idea of how I might be able to fix it in the future and it’s useable for now.
More broadly, I’d like to feel like I know how to do things in queries, or at least know where to look
What are the subskills of this skill? What are the smaller skills I need to master first, and in what order?
Understand the difference between simple and advanced queries (jot down some ideas for each as you learn!)
Understand properties, namespaces, hierarchy, tagging, etc. (i.e., ways to organize or structure your data)
Boolean logic
(more to be added as I learn)
What are critical tools? What tools do I need every time I want to learn theory or practice applying it?
Logseq desktop app
Internet access! To help debug since I’m brand new to this
Ohhh … very interested in this! I just started creating my own recipe graph. I look forward to learning how you set yours up. I’m fairly new to Logseq and am wading through what it’s capabilities are.
I got bogged down over the last few days (after I made my learning plan) by getting some of the things done for my queries to actually do anything useful. I’m still not done that, but I really should get to learning queries syntax and all that jazz
Simple queries all use the syntax {{query [that thing you want to know]}}
Advanced queries use [[Datalog]], a declarative logic programming language, implemented here in [[ Clojure]], a dialect of [[Lisp]]
Do I fully understand what all this means yet? No, but hopefully we will get there! I have at least heard of lisp before (though I haven’t used it), so there’s that!
Simple queries operate using boolean logic filters to help refine what it is you’re searching for:
and will match only things that fit all the criteria laid out in your query. It helps decrease the number of search results you’ll get
From Boolean logic 101: “Imagine you’re searching a library catalog, a search engine, a database, or even your notes. You want to see everything you have about ‘ghosts’, so you search the keyword ghosts. Let’s say you get 100 results from that. That’s a lot! You realize you actually only wanted to see results about ghosts in Shakespeare plays. You want to decrease your results. You search for ghosts AND Shakespeare. Now you only get 20 results.”
Let’s say I want to query papers that talk about both #Smilodon/fatalis and #Panthera/atrox , since they’re sometimes (but not always) found in the same localities. I don’t have my paper notes all properly stored in Logseq yet, so this won’t totally work, but it should at least pull up this block! (it does)
or does the opposite, and will match things that fit any of the criteria in your query. It will increase the number of search results you’ll get
From Boolean logic 101: “OR increases the number of search results. In a Venn diagram, OR brings us the entirety of both circles and where they overlap. This OR is not exclusionary, meaning results can contain both or either.”
Maybe I want any paper on any of the three species of Smilodon, including specimens not diagnosed beyond the genus level?
not will reduce the number of search results you get by excluding anything that matches this particular criterion
From Boolean logic 101: “Now you want to see results that are about ghosts but not about Shakespeare. You search ghosts NOT Shakespeare. If our original search for ghosts was 100 results, and if our search for ghosts AND Shakespeare was only 20 notes, then the number of notes about ghosts but not about Shakespeare is 80. In a Venn diagram, this query would be only the part of the ghost circle that didn’t overlap with the Shakespeare circle”
Now let’s say I want to see anything that talks about #Smilodon/fatalis but notPanthera atrox. These may indicate places where further field work may find some P. atrox fossils, or they may be localities outside the latter’s range, which would be cool (and is probably the case in South America)
page will search for specific page names only. I have used this in conjunction with not to get [[Active Todos]] to show only active tasks not including the recurring ones on my templates page
Clarification: and, or, and not are operators, while things like between and page are filters
Clarification #2: you can list specific dates in the between filter, e.g. {{query (between [[July 15th, 2022]] [[July 31st 2022]])}}
Let’s continue learning filters:
property allows for filtering within block properties (page properties can also be filtered, see below)
this uses the syntax property ([property key] [property value]), with the property key being something like “type”, “author”, etc. and the value being the value for that block. These are specified in block properties as [key]:: [value], e.g., type:: book
I don’t have anything with block properties yet, so won’t test this directly now, but I think it should work easily, especially as long as I can get page properties to work
full-text queries can be done by simply adding the search term in quotation marks after the query command, e.g., {{query "search term"}}. This will include the search term both inside and outside of links
I’m going to try searching for the term “EDI” since I know I have it unlinked in spots
{{query(“EDI”)}}
task will search for - you guessed it! - tasks, and takes Logseq’s task types (todo, now, later, etc.) as an argument. An example is {{query (task now todo)}}, which will pull all tasks that are listed as TODO or NOW
{{query((task now todo))}}
priority will similarly search for the different priority tags used by Logseq. I don’t use these currently (though tbh I probably should), so I won’t test that now
page-property works just like property but searches pages. It also takes the key and value as arguments
I know I can search this one using my [[Readwise]] imports. I’m going to search for pages with the author property of [[Mark S. Boyce]]
{{query((page-property author [[Mark S. Boyce]] ))}}
page-tags allows you to search for a specific page property: tags. I’ll probably use this later for tagging paper notes/highlights with tags as outlined in my [[Tagging SOP]]
all-page-tags lists all your page tags! Neat! I don’t have any yet, so this query turns up blank for me.
{{query((all-page-tags))}}
You can also sort the results of any simple query using sort-by
This takes two arguments, key and order: {{query (sort-by key order)}}
key is whether you would like to sort by created-at or updated-at
order can be asc or desc and defaults to desc if omitted
Now I’ll read [[Jay Colbert]]'s guide to his [[Zettelkasten]] workflow
TODO add link to Readwise highlights once they’re imported
Lots of interesting queries here, though (a) I haven’t been using a [[Zettelkasten]] and (b) the syntax suggests these are advanced queries, but they also look like they’re simple queries with some extra commands for their display. Maybe revisit once I’m ready for advanced queries
I’m still not sure how I’d like to go about using blocks vs pages. Seems like lots of the tips here should work either way, but I’m not entirely sure
#question: when you give block properties to a block containing a link to a page, does the page inherit those properties? I suppose not, or else that would break [[Jay Colbert]]'s pretty graph?
I should also catch up on the talk on simple queries from today since I had a lazy morning and missed it
Can use <% current-page %> in queries (and save that query) and use that to run the same query on multiple pages without changing anything
#question: does this need to be wrapped in an and operator with the query value(s)? My assumption is yes?
What is a query language?
Need some way to tell a computer what to look for
Googling is querying! And Google is a database of webpages.
Logseq is a database that creates, reads, and edits your markdown files; those files have metadata associated
Our queries are telling the Logseq database what we want to see
Logseq has two data languages: Datalog for advanced queries and “simple queries”
BUT under the hood, simple queries are “preprogrammed” queries, making things easier for the end user
Clojure, which is what Logseq queries use, is written slightly differently from most programming languages, which is why the function comes first (e.g. and x y instead of x and y)
This sounds like some operations in R tbh, at least in the sense that I’m used to telling R what function I want first, then passing along the data
I think the key here is that Clojure operates differently from natural language (at least in English)
Bug: queries currently don’t look properly up or down the hierarchy - i.e., it’s only looking for tags in one block and doesn’t include child blocks
Ramses says this should be fixed in the next update, so I wonder if it’s done now? There was an update this morning, but that might have been before this talk
Nope - we’re using the same version
Simple queries are quick and simple, so easiest to write them as you need them
Adding to my [[ideas for simple queries]]:
book log
video game log
knitting/sewing/etc project log
[academic] project log
TODO do some work on what metadata would be useful for the types of pages you’re creating or planning to create
Can simple queries access logbook (e.g., time tracking, created at, etc.) entries?
There are some workarounds, e.g., creating properties for each thing you want to log (such as minutes spent practicing a language) and using plugins that help visualize this information
Can at least do this with advanced queries (will also live update, unlike above), but not for simple queries yet?
some fun new things with page (and block??) properties:
can click on the key to open it as a page
can type :: to get a list of all your properties
Side note: I really appreciate how much Logseq feels like a community project. I mean it is, because it’s open source software, but it’s just great to see how responsive the team is to the community’s ideas.
I’ll be changing my query learning times to be in the evening, around 8pm. I swear the closer to programming a task is, the more I enjoy doing it at night, haha.
Woke up at around 4am with thoughts on what I should be using queries for and how to implement them. That’s great for my learning, but maybe not so great for my sleep lol
Going to add some recipes so I can get started with some simple queries. These are recipes that were either categorized as favourites or ones to try in my old Notion system.
[[Caramelized Cauliflower Cacio e Pepe]]
[[Roasted Brussels Sprout Pasta]]
[[Butternut Squash Risotto]]
[[Toasted Naan]]
[[Roasted Jalapeno Hummus]]
[[Tofu Bacon]]
Have a simple query going to put on the tag pages for specific page properties, all making use of <% current page %> (NOTE TO SELF: there is no hyphen in “current page”!)
{{query (page-property category <% current page %>)}}
{{query (page-property recipe-thoughts <% current page %>)}}
{{query (page-property recipe-author <% current page %>)}}
{{query (page-property recipe-ingredients <% current page %>)}}
{{query (page-property tags <% current page %>)}}
{{query (page-property grocery-stock <% current page %>)}}
{{query (page-property grocery-type <% current page %>)}}
These are the things I want my recipe system to do, and if I think they can be done with simple or advanced queries (though I haven’t even gotten into learning advanced queries yet)
Simple queries
See at a glance which recipes I want to try, and which are ones I’ve made before and liked (done)
See at a glance which recipes use ingredients I already have on-hand (done)
Tell which staple groceries (like oil, salt, pepper, etc.) are running low or out of stock - should just need to add a tag for staple groceries
See which recipes I want to make within a specific time frame (to help plan grocery trips) - should be doable with simple queries, using a combination of page properties and between?
See which produce are currently in season
Advanced queries
Tell which groceries are in a planned recipe AND are low/out of stock
I can’t think of how to do this with simple queries, but I’m still a novice so please tell me if I’m wrong!
Figure out which recipes have all ingredients in stock, or are missing only a few ingredients
I’m afraid this is about as far as I’ve gotten. I’ve been busy finishing up my PhD so haven’t had the energy to do something like this on top of that. I’m hoping to get back to it in the next couple months though!
Hi all,
Hi ashinonyx,
in your example you use many properties for the metadata. I would need to clean up my recipes and store them in a uniform way. I am thinking of using LogSeg for this.
In my research on options, I came across Cooklang - Recipe Markup Language (https://cooklang.org/). There seems to be an Obsidian plugin for this as well.
No idea if it makes sense to use Cooklang. Maybe the exchange of recipes would be easier.