Marketplace reading-logseq-data
install
source · Clone the upstream repo
git clone https://github.com/aiskillstore/marketplace
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/aiskillstore/marketplace "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/c0ntr0lledcha0s/reading-logseq-data" ~/.claude/skills/aiskillstore-marketplace-reading-logseq-data && rm -rf "$T"
manifest:
skills/c0ntr0lledcha0s/reading-logseq-data/SKILL.mdsource content
Reading Logseq Data
When to Use This Skill
This skill auto-invokes when:
- User wants to read pages or blocks from their Logseq graph
- Fetching properties or metadata from Logseq entities
- Executing Datalog queries against the graph
- Searching for content in Logseq
- Finding backlinks or references
- User mentions "get from logseq", "fetch page", "query logseq"
Client Library: See
{baseDir}/scripts/logseq-client.py for the unified API.
Available Operations
| Operation | Description |
|---|---|
| Get page content and properties |
| Get block with children |
| Full-text search across graph |
| Execute Datalog query |
| List all pages |
| Find pages linking to this one |
| Get current graph metadata |
Quick Examples
Get a Page
from logseq_client import LogseqClient client = LogseqClient() page = client.get_page("My Page") print(f"Title: {page['title']}") print(f"Properties: {page['properties']}")
Execute Datalog Query
# Find all books with rating >= 4 results = client.datalog_query(''' [:find (pull ?b [:block/title :user.property/rating]) :where [?b :block/tags ?t] [?t :block/title "Book"] [?b :user.property/rating ?r] [(>= ?r 4)]] ''') for book in results: print(f"{book['block/title']}: {book['user.property/rating']} stars")
Search Content
# Search for mentions of "project" results = client.search("project") for block in results: print(f"Found in: {block['page']}") print(f"Content: {block['content'][:100]}...")
Datalog Query Patterns
Find All Pages
[:find (pull ?p [:block/title]) :where [?p :block/tags ?t] [?t :db/ident :logseq.class/Page]]
Find Blocks with Tag
[:find (pull ?b [*]) :where [?b :block/tags ?t] [?t :block/title "Book"]]
Find by Property
[:find ?title ?author :where [?b :block/title ?title] [?b :user.property/author ?author] [?b :block/tags ?t] [?t :block/title "Book"]]
Find Tasks by Status
[:find (pull ?t [:block/title :logseq.property/status]) :where [?t :block/tags ?tag] [?tag :db/ident :logseq.class/Task] [?t :logseq.property/status ?s] [?s :block/title "In Progress"]]
Find Backlinks
[:find (pull ?b [:block/title {:block/page [:block/title]}]) :in $ ?page-title :where [?p :block/title ?page-title] [?b :block/refs ?p]]
Aggregations
;; Count books per author [:find ?author (count ?b) :where [?b :block/tags ?t] [?t :block/title "Book"] [?b :user.property/author ?author]]
Using the Client Library
Initialization
from logseq_client import LogseqClient # Auto-detect backend client = LogseqClient() # Force specific backend client = LogseqClient(backend="http") # Custom URL/token client = LogseqClient( url="http://localhost:12315", token="your-token" )
Error Handling
try: page = client.get_page("Nonexistent Page") except client.NotFoundError: print("Page doesn't exist") except client.ConnectionError: print("Cannot connect to Logseq") except client.AuthError: print("Invalid token")
Batch Operations
# Get multiple pages efficiently pages = ["Page1", "Page2", "Page3"] results = [client.get_page(p) for p in pages] # Or use a single query query = ''' [:find (pull ?p [*]) :in $ [?titles ...] :where [?p :block/title ?titles]] ''' results = client.datalog_query(query, [pages])
Performance Tips
- Use specific queries - Don't fetch more than needed
- Prefer pull syntax -
vs(pull ?e [:needed :fields])[*] - Put selective clauses first - Filter early in query
- Use parameters - Pass values via
clause:in - Batch when possible - Multiple items in one query
CLI Fallback
If HTTP API unavailable, the client falls back to CLI:
# CLI mode (automatic if HTTP fails) client = LogseqClient(backend="cli", graph_path="/path/to/graph") # Query still works the same way results = client.datalog_query("[:find ?title :where [?p :block/title ?title]]")
Output Formats
Raw (default)
Returns Python dicts/lists directly from API.
Normalized
# Get normalized output page = client.get_page("My Page", normalize=True) # Returns: {"title": "...", "uuid": "...", "properties": {...}, "blocks": [...]}
Reference Materials
- See
for all operations{baseDir}/references/read-operations.md - See
for query patterns{baseDir}/templates/query-template.edn