Updating previously imported cards?

63 views
Skip to first unread message

Alejandro Forero Cuervo

unread,
Apr 24, 2020, 12:29:21 AM4/24/20
to mnemosyne-...@googlegroups.com
Hello,

I'm super happy with Mnemosyne, which I've been using since 2014. I currently have 8.1k cards. I find it very useful! I'm a huge fan. :-)

I'm beginning to generate cards from my set of notes (my Zettelkasten, as described in https://github.com/alefore/weblog/blob/master/zettelkasten.md#spaced-repetition-and-notes) that I import into Mnemosyne. I consider my notes my canonical source of information and I just want to be able to import them into Mnemosyne. I have been quite successfully generating and importing tab separated files. It works great!

I was wondering if there's a way to update previously imported cards (without losing their state)? When I update my notes with additional information, I would love for their associated cards to be updated.

For example, I have a note like this (simplifying somewhat):

Paul Klee timeline:
* 1879: Born in Münchenbuchsee, Switzerland.
* 1940: Died.  

zkcloze("1940", "year");
zkclose("Switzerland", "Country");
zkcloze("1879", "year");

The last 3 lines basically specify that 3 flashcards should be generated, using cloze deletion, replacing specific tokens (e.g., "1879") with a hint ("___year___"), such as:

Paul Klee timeline: <ul><li><b>___year___</b>: Born in Münchenbuchsee, Switzerland</li><li>1940: Died.</li></ul>\t  Paul Klee timeline: <ul><li><b>1879</b>: Born in Münchenbuchsee, Switzerland</li><li>1940: Died.</li></ul>

So far so good. This works great!

However, if I edit the note in the future (perhaps I register the fact that he got married in 1906; or maybe I discover that I had the city wrong), I would like to just update the three notes to include this additional data *without losing all the state*.

Does anybody have any suggestions for how to do this? I think part of the challenge is cross-linking the "zkclose" lines in my note with some IDs in Mnemosyne so that when I generate the new tab-separated file with updated cards, each new card can be associated with the corresponding card previously imported to Mnemosyne's db. Perhaps there's some way I can generate some ~random IDs (in a very large namespace so that the probabilities of collisions are negligible) and just insert the notes with such IDs? Is something like this possible? Failing that, is there some way to reimport notes and have Mnemosyne just update previously imported notes?

Perhaps I should generate SQL sentences and import them directly into Mnemosyne's sqlite database? That sounds a bit brittle, so I'm looking for some alternative. :-) But, failing that, I guess I'll look more closely at SQLite.py to try to make sure I understand the semantics of the fields in the "insert into cards" statement in SQLite.add_card. But, yeah, I'd rather use a more "supported" route. :-) Maybe there's some other format (than the tab-separated text files) that supports importing cards containing some ID?

Thanks in advance for all your help! And, apart from this, thanks a ton for maintaining such a useful piece of software! It has had a very positive impact in my life.

peter.b...@gmail.com

unread,
Apr 24, 2020, 7:31:58 AM4/24/20
to mnemosyne-...@googlegroups.com

Hi,

 

Glad you like Mnemosyne!

 

There’s two options to achieve what you want:

 

One is to use the Python API to create, retrieve and edit cards (see https://github.com/mnemosyne-proj/mnemosyne/tree/master/mnemosyne/example_scripts for examples). I would not recommend directly approaching the sqlite database, as that will result in the sync algorithm not picking up any changes (that’s what all the logging statements are for).

 

Alternatively, you can try to manually create a *.card files instead of a text file, as these contain ids so that later on you can import them again to result in an update.

 

https://github.com/mnemosyne-proj/mnemosyne/blob/master/mnemosyne/libmnemosyne/file_formats/mnemosyne2_cards.py

 

A *.cards file is basically a zipfile. Just look into one to get a feeling for how it is put together.

 

Good luck!

 

Peter

--
You received this message because you are subscribed to the Google Groups "mnemosyne-proj-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mnemosyne-proj-u...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/mnemosyne-proj-users/CAJphAxVy%2BGn-LxTEDupMTRR0f0NSMKRFteAptku6xv4eOpe%3DUQ%40mail.gmail.com.

Alejandro Forero Cuervo

unread,
Apr 24, 2020, 12:27:32 PM4/24/20
to mnemosyne-...@googlegroups.com
Awesome, thank you very much for your help, Peter!

Looks easy enough. I guess I'll probably use the Python API, that example you sent me looks pretty straightforward. Once I've figured out the details (e.g., how to generate IDs and such), I'll probably update this thread with the results, in case others find it useful.

Thanks again!

Alejandro Forero Cuervo

unread,
Apr 26, 2020, 10:55:32 AM4/26/20
to mnemosyne-...@googlegroups.com
I figured I'd post an update in case someone else finds this useful. Obviously, it's possible I'm doing something stupid, but ... it seems to be working. :-)

The script I'm using is here: https://github.com/alefore/edge/blob/master/src/clozes.py. It reads my entire set of Markdown files and outputs a cards.xml file with cloze deletion facts+cards. I wrote a bit about it in: https://github.com/alefore/weblog/blob/master/zettelkasten.md#spaced-repetition-and-notes

At first, I tried to use the libmnemosyne API but figuring out how to update previously created cards (e.g., if the index property of a cloze deletion card changes) seemed tricky. So I opted for using the *.cards approach. I'm generating the IDs of the facts/cards in a ~stable manner (fact IDs are a function of the path where they were found, cloze deletion card IDs are a function of the path + hash of the answer).

Thank you once again, Peter, for your help! The suggestion to just generate *.cards files was super useful! <3

Peter Bienstman

unread,
Apr 26, 2020, 12:00:48 PM4/26/20
to mnemosyne-...@googlegroups.com
Great, thanks for reporting back!

Peter 

Reply all
Reply to author
Forward
0 new messages