emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Link type in org-mode, but with org-roam ?
@ 2023-02-13 16:05 Cletip Cletip
  2023-02-14 10:41 ` Jean Louis
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Cletip Cletip @ 2023-02-13 16:05 UTC (permalink / raw)
  To: Org Mode List

[-- Attachment #1: Type: text/plain, Size: 7538 bytes --]

Hello everyone.

I apologize in advance for :
- my org-mode philosophy (my ideas may be totally stupid, meaningless, or
even contrary to the original org-mode philosophy)
- my knowledge of the mailing-list (my mail may be badly organised, badly
indented, the code unclear etc)
- any other point that might irritate you because of my lack of knowledge
of certain things
- the length of this mail
- for my bad bad bad english

 I'm going to get straight to the point and try to be as concise as
possible, just for context: I've been using org-mode every day for at least
2 years. I want to make it my personal knowledge/information manager. I
understand code relatively quickly, I understand less when it comes to
writing it. I've done a lot of research on note-taking methods... well, you
can see my profile I think.
So, my goal: to make a concise system with org-mode, org-roam, org-attach,
org-agenda etc... a "classic" goal for some of us :).
I won't describe any of the tools mentioned here, it would make the mail
much too long.

The problem: need to make "queryable" notes to do more or less complex
operations. For example, run the code of all headings/notes that have the
tag "ubuntu", to allow me to reinstall my computer for example. This
problem is trivial to solve with tags (a simple "dolist" is enough), but
tags will not always be enough... So you need to be able to store
"value-key" data, in order to make "select me all the people with a phone
number starting with 06" queries. This works perfectly well with this:
https://github.com/d12frosted/vulpea#metadata.


This gives things of the following conceptual form:
note1(where the metadata is stored) -> relationship -> note2/OrValue.

What is stored in the database must be only the IDs (not the titles of the
note for example), but the description is there for the user. This allows
not to have a controlled vocabulary: when searching, we look for a note id,
and not a string. On the other hand, what is displayed to the user in the
notes is the description, which is very practical.

note1 is therefore the id of a note (in the org-roam sense).
Relation is the id of the "metadata"/type of the desired relation.
And note2/Value is the value of the relationship, which may be an id of
another note or just a value.
In practice, it is therefore in this form:
- [[id:20230112135328669948][Name you want, but respect the idea of the
concept behind the id]] :: [[id:20220617105453042719][Another note]]
- [[id:20230112135328669948][a metadata only with a value]] :: just a value

The concept is close to the "In-Buffer Settings", with a "#+": it's a
key-value. Except that In-Buffer Settings, org-mode can't understand that
there is a link or something else, org-mode understands just a string,
which will be parsed to modify org-mode's behaviour on that file, or for a
export, etc.

Concrete example: if I want to store all my music (eache music = a note
with an attached file), I have two choices:
- I put the tag "music", in the org-roam sense (i.e. "#+filetag: #music")
for each note.
- But, this amounts to writing: aMusic relation(here, "tagged with" for
example) note2 or in practice: - [[idOfTaggedwith][tag]]:
[[idOfTheConceptOfMusic][music]]. So we can make the following request:
give me the notes with the metadata "idOfTaggedwith" with the value
"idOfTheConceptOfMusic" (because, I remind you, only ids are stored. Just
make a convenient interface for the user, and he won't even need to think
about ids).

Conceptually and omitting the other usefulness of In-Buffer Settings, it's
exactly the same thing.

Furthermore, I think this problem is part of a more global problem: they
are "typed links". They can be called by many names: link tags
https://org-roam.discourse.group/t/add-link-tags-feature/171, link types,
relational links, etc. If someone has the "right" name to describe this...

And therein lies my real problem: I haven't found a single good solution to
achieve this. This problem is mostly related to org-roam, but org-roam is
based on org-mode, that's why I'm writing here.
I thought of the following solution, so I'd like to have some opinions.
Main idea: make a link type that would be recognized not by "X:path" with X
= link type, but by a regular expression, where if X respects a certain
format, it is recognized as a relationship.

As you know, external links can be of the form "X:path", where X equals id,
file, gnus etc. Note: Org-roam stores all types of links.
So we can make the following type of links:
[[A:B][description]]
where
- A is the id of a note known by org-roam
- B is the id of a note, or string, or numeric value, etc
- description is a description (what a precision)

This allows org-roam to store the type of the relationship, A, and the
value of the relationship, B. So we can make queries like: "all notes where
idOfTaggedwith = idOfTheConceptOfMusic".

Implementation (functional on my side. It took me a lot of time, because I
didn't know the org-mode code. But it's done without too much difficulty I
think, as it's a link addition). :
- modification of org-element-link-parser (yes, I dare to modify this. Tell
me if I'm doing it right or not), origin of the link type detection. Put a
condition before the "fuzzy" type, which would detect with a regular
expression if the type matches an id. This could be :
  ((string-match regex-of-an-id raw-link)
            (let ((type-path (split-string raw-link ":")))
              (setq type (car type-path))
              (setq path (cadr type-path))))
- modification of "usual" functions (export, follow, open etc)
  - org-link-open searches last for dedicated "fuzzy" function in custom
links. So we can add a condition before with the following idea:
    ;; check if the type is an id for relation-id
        ((pred ((lambda (type) (string-match regex-of-an-id type))))
         ;; ask for the link of the relation or the destination
         (if (yes-or-no-p "Open the relation ?")
             (org-id-open type nil)
           (org-id-open path nil))
           ;; here case of fuzzy link
     The other cases should be taken into account, if the "path" is not an
id, but just a value, or a value + a string
  - Other functions I didn't do, but not unfeasible.

Some problems arise like :
- org-mode "fits" org-roam, and not the other way around. On the other
hand, if there is a real use for this kind of link, then org-roam would be
the one to adapt. (Because a relationship is defined here by a note...
which is an org-roam note. But that could be a simple id generated by
org-mode... I don't know. Relationship are perhaps not so necessarily id...)
- My implementation requires a modification of org-mode, which I think is
not normal. I think it's better add a layer of code with another package.

In summary, I have several questions:
- is my idea bad? If yes, why ?
- I'm sure some people have already thought about what I've done. Is there
an implementation already done ?
- How to make this implementation without modifying org-mode, but only
org-roam? Overwritten functions with modified functions? Like with this
example: (org-link-set-parameters "id" :follow #'org-roam-id-open), where
org-roam-id-open is defined in org-roam.
- is there another solution to my main problem: making my notes queryable ?
- Some people often have subjects related to this type of question (I think
in particular of a certain "Jean Louis"): have you found better solutions?

I thank you in advance for reading me, and thank you very much in advance
for your answers.

[-- Attachment #2: Type: text/html, Size: 8397 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Link type in org-mode, but with org-roam ?
  2023-02-13 16:05 Link type in org-mode, but with org-roam ? Cletip Cletip
@ 2023-02-14 10:41 ` Jean Louis
  2023-02-16 12:44 ` Ihor Radchenko
  2023-02-16 20:40 ` Jean Louis
  2 siblings, 0 replies; 6+ messages in thread
From: Jean Louis @ 2023-02-14 10:41 UTC (permalink / raw)
  To: Cletip Cletip; +Cc: Org Mode List

* Cletip Cletip <clement020302@gmail.com> [2023-02-13 19:08]:
> I'm going to get straight to the point and try to be as concise as
> possible, just for context: I've been using org-mode every day for at least
> 2 years. I want to make it my personal knowledge/information manager. I
> understand code relatively quickly, I understand less when it comes to
> writing it. I've done a lot of research on note-taking methods... well, you
> can see my profile I think.

Where is the profile? I like note-taking researcher profiles. 🤓

> So, my goal: to make a concise system with org-mode, org-roam, org-attach,
> org-agenda etc... a "classic" goal for some of us :).

Good that I have given up on that puzzle of making Org database,
rather using PostgreSQL database straight, and deriving Org out of it.

> The problem: need to make "queryable" notes to do more or less complex
> operations. For example, run the code of all headings/notes that have the
> tag "ubuntu", to allow me to reinstall my computer for example. This
> problem is trivial to solve with tags (a simple "dolist" is enough), but
> tags will not always be enough... So you need to be able to store
> "value-key" data, in order to make "select me all the people with a phone
> number starting with 06" queries. This works perfectly well with this:
> https://github.com/d12frosted/vulpea#metadata.

I have seen that link, and I understand the attempt. 

> This gives things of the following conceptual form:
> note1(where the metadata is stored) -> relationship ->
> note2/OrValue.

Okay, it is good concept.

> What is stored in the database must be only the IDs (not the titles
> of the note for example), but the description is there for the
> user. This allows not to have a controlled vocabulary: when
> searching, we look for a note id, and not a string. On the other
> hand, what is displayed to the user in the notes is the description,
> which is very practical.

Yes. Very handy.

> note1 is therefore the id of a note (in the org-roam sense).

Why not call it "Note ID" then?

> Relation is the id of the "metadata"/type of the desired relation.

Yes, sure understandable.

> And note2/Value is the value of the relationship, which may be an id of
> another note or just a value.

Yes, sure understandable, though complicated without reason.

> In practice, it is therefore in this form:
> - [[id:20230112135328669948][Name you want, but respect the idea of the
> concept behind the id]] :: [[id:20220617105453042719][Another note]]
> - [[id:20230112135328669948][a metadata only with a value]] :: just
> a value

Who knows what it means...

I like to understand your thoughts.

> The concept is close to the "In-Buffer Settings", with a "#+": it's
> a key-value. Except that In-Buffer Settings, org-mode can't
> understand that there is a link or something else, org-mode
> understands just a string, which will be parsed to modify org-mode's
> behaviour on that file, or for a export, etc.

Something similar but not same is here. This is generated Org snippet:

*  http://dantorop.info/project/emacs-animation/lisp1.html [0/0] [0%]	:Emacs:WWW-bookmark:
   :PROPERTIES:
   :UUID: 38484E86-CBCB-46B8-907F-CEBA90DA9F4D
   :END:

WWW: [[http://dantorop.info/project/emacs-animation/lisp1.html]]

There are many properties on the above snippet, which one cannot see
directly. They are held in the database. It all goes in momentum. The
UUID is the hyperlink, I press M-TAB on it and get straight to object,
to edit properties of all kinds, and what you see below is not all,
there are tags, timestamps, related people, related other objects,
etc. Anything is possible

                             ID   31724
                   Date created   "2020-11-10 02:29:52.72204+03"
                  Date modified   "2023-02-14 11:29:47.202234+03"
                   User created   "maddox"
                  User modified   "maddox"
                      Time zone   "1"
            Start Date and Time   nil
              End Date and Time   nil
                    Markup Type   "Default (Text)"
         Elementary object type   "WWW"
      Elementary object subtype   "Default"
                           Name   "http://dantorop.info/project/emacs-animation/lisp1.html"
                      Hyperlink   "http://dantorop.info/project/emacs-animation/lisp1.html"
                      Arguments   nil
                    Description   nil
                           Text   nil
           Internal information   ""
                      Parent ID   "GNU Emacs"
                         Author   nil
                     Permission   "Default"
                       Revision   nil
                Number of pages   nil
                       Language   nil
                      File size   nil
                    Time length   nil
                          Width   nil
                         Height   nil
                           Hash   nil
                  GPG Signature   nil
                          Pages   nil
            Related people list   nil
                 Related person   nil
               Related business   nil
                  Search status   "Default"
                   Set Priority   100
                    Author Name   nil
                     Properties   nil
                Emacs Lisp Hash   nil
                      Publisher   nil
                           Time   nil
        Assigned to people list   nil
            Assigned to contact   nil
                    Global Rank   1
                         Active   t
                  Action status   ""
                Global priority   100000
                   Related URIs   nil
                       Template   nil
                       WRS Area   nil
                Publishing type   nil
                           Slug   nil
                        License   nil
                      File type   nil
                         Report   nil
                         Tokens   "'/project/emacs-animation/lisp1.html':3,7 '31724':4 'bookmark':11 'dantorop.info':2,6 'dantorop.info/project/emacs-animation/lisp1.html':1,5 'emac':8 'www':10 'www-bookmark':9"
             Temporary Document   nil
            Override Major Mode   nil
                    Minor Modes   nil
                Related country   nil
                      Report to   nil
              Physical location   nil
                    Lead Source   nil
                       Currency   nil
               Sales Flow Stage   nil
                   WRS Category   nil
                       WRS Menu   nil
                   WRS Keywords   nil
                   WRS Priority   10
                WRS Not in Menu   nil
                  WRS Main Page   nil
                   WRS OG Image   nil
                        Curator   nil
                      Comm Line   nil
                       Location   nil
 AVAILABLE (was Assigned to people list)   nil
                            SKU   nil
                 Value or Price   nil
                  Introduced by   nil
                           UUID   "38484e86-cbcb-46b8-907f-ceba90da9f4d"
                    Admin Scale   nil
               Admin Scale Type   nil
             Admin Scale Parent   nil
           Admin Scale Priority   0
           Programming Language   nil

> Concrete example: if I want to store all my music (eache music = a note
> with an attached file), I have two choices:
> - I put the tag "music", in the org-roam sense (i.e. "#+filetag: #music")
> for each note.
> - But, this amounts to writing: aMusic relation(here, "tagged with" for
> example) note2 or in practice: - [[idOfTaggedwith][tag]]:
> [[idOfTheConceptOfMusic][music]]. So we can make the following request:
> give me the notes with the metadata "idOfTaggedwith" with the value
> "idOfTheConceptOfMusic" (because, I remind you, only ids are stored. Just
> make a convenient interface for the user, and he won't even need to think
> about ids).

Any writing should be swift and integrated. User should not have
problems connecting objects and their properties or other objects.

You are right, thinking of IDs is redundant

I would not store only tags, as tags are only floating types. I would
define types, subtypes, maybe subsubtypes, and then define what is to
be done for each combination of types and subtypes. Using tags is
always possible to define types, but then it becomes non-rigid, and
thus vague system.

I do think that using only UUID is and should be enough, and such UUID
should have properties defined elsewhere:

* My music name
  :PROPERTIES:
  :UUID:     e477da5d-2c51-460e-a13e-3faba74d2aa0
  :END:


But we can also think of this case:

* My music name
  :PROPERTIES:
  :UUID:     e477da5d-2c51-460e-a13e-3faba74d2aa0
  :TYPE:     Audio
  :SUBTYPE:  Music
  :END:

or something like this:

* My music name
  :PROPERTIES:
  :UUID:     e477da5d-2c51-460e-a13e-3faba74d2aa0
  :TYPE:     Music
  :SUBTYPE:  Country
  :END:

Then you can define what you wish for combination:

"Music, Country"

as you could have some other combination

"Music, My favorite"

for which you could define something else, some other action, some
other intersection list or play list.

> Furthermore, I think this problem is part of a more global problem: they
> are "typed links". They can be called by many names: link tags
> https://org-roam.discourse.group/t/add-link-tags-feature/171, link types,
> relational links, etc. If someone has the "right" name to describe this...

Which is alright. That is how it should be. 

Elementary Objects:
https://www.dougengelbart.org/content/view/110/460/#2a1a

I think of "link" as one of possible elementary objects. When there is
feature to "tag" them or assign properties, that means we get
intersection feature to query them and make more decisions how to
handle such objects

> And therein lies my real problem: I haven't found a single good
> solution to achieve this. This problem is mostly related to
> org-roam, but org-roam is based on org-mode, that's why I'm writing
> here.

I do not use it, but what you say is quite understandable, that is
what I use daily in my work.

Org is not a relationship database, it is not designed for
relationships, though there are good attempts to it.

It is very easy to create a relationship table in any kind of database
and use it with Org.

1. Create a single table with Org UUID, ID, referencing other UUID, ID
----------------------------------------------------------------------

-- ------------------------------------------
-- ------------ Table orgrels
-- ------------------------------------------
DROP SEQUENCE orgrels_id_seq;

CREATE TABLE orgrels (
orgrels_id SERIAL NOT NULL PRIMARY KEY,
orgrels_uuid UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE,
orgrels_fromuuid UUID NOT NULL,
orgrels_touuid UUID NOT NULL,
orgrels_datecreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
orgrels_datemodified TIMESTAMP,
orgrels_usercreated TEXT NOT NULL DEFAULT current_user,
orgrels_usermodified TEXT NOT NULL DEFAULT current_user,
orgrels_name TEXT,
orgrels_description TEXT
);
GRANT ALL ON orgrels TO PUBLIC;

DROP VIEW orgrels_combo;

CREATE OR REPLACE VIEW orgrels_combo AS
SELECT orgrels_id AS id,
orgrels_name AS TEXT
FROM orgrels;
GRANT SELECT ON orgrels_combo TO PUBLIC;

COMMENT ON TABLE orgrels IS 'Org Relationships;
COMMENT ON COLUMN orgrels.orgrels_id IS 'ID';
COMMENT ON COLUMN orgrels.orgrels_uuid IS 'From UUID';
COMMENT ON COLUMN orgrels.orgrels_touuid IS 'To UUID';
COMMENT ON COLUMN orgrels.orgrels_datecreated IS 'Date created';
COMMENT ON COLUMN orgrels.orgrels_datemodified IS 'Date modified';
COMMENT ON COLUMN orgrels.orgrels_usercreated IS 'User created';
COMMENT ON COLUMN orgrels.orgrels_usermodified IS 'User modified';
COMMENT ON COLUMN orgrels.orgrels_name IS 'Name';
COMMENT ON COLUMN orgrels.orgrels_description IS 'Description';

-- Triggers
-- For Date Modified
CREATE TRIGGER orgrels_moddatetime
BEFORE UPDATE ON orgrels
FOR EACH ROW
EXECUTE PROCEDURE moddatetime(orgrels_datemodified);

-- For User Modified
CREATE TRIGGER insert_username_orgrels
BEFORE INSERT OR UPDATE ON orgrels
FOR EACH ROW
EXECUTE PROCEDURE insert_username(orgrels_usermodified);

-------------

Once above table is created it becomes ~very~ possible to see all of
the related other Org UUID headings.

But why go there in that direction of mixing Org and database at all,
when it can all be done easier with databases anyway.

Org Roam (which I do not use) demonstrates good design of relations
between objects.

> As you know, external links can be of the form "X:path", where X equals id,
> file, gnus etc. Note: Org-roam stores all types of links.
> So we can make the following type of links:
> [[A:B][description]]
> where
> - A is the id of a note known by org-roam
> - B is the id of a note, or string, or numeric value, etc
> - description is a description (what a precision)

That is very nice, that demonstrates relationship ID, though I see it
as single relationship. I use that in my Hyperscope system and
represent it as following:

                             ID   1
                Hyperdocument 1   "Ideas on how to use Hyperscope dynamic knowledge repository"
                Hyperdocument 2   "Principles of HyperScope File Sorting System"
                    Description   nil
                  Relation type   "Default"
                   Date created   "2022-09-10 08:22:01.090606+03"
                  Date modified   "2022-09-10 08:23:43.113135+03"
                   User created   "maddox"
                  User modified   "maddox"
                           UUID   "694267c9-6d2c-4bc0-a736-cd1b5e69058a"

So I can use that UUID and Description to make that link:

[[uuid:694267c9-6d2c-4bc0-a736-cd1b5e69058a][description]]

Then based on UUID, I can go to that above relationship. One click and
I see relationship.

(defun hyperscope-see-relationship (id)
  "Jump to Hyperdocument relationship by UUID."
  (rcd-db-tabulated-edit-entry "relatedhyperdocuments" id))

(defcustom rcd-db-uuid-action-alist '(("people" . cf-people-by-id)
				      ("hyobjects" . hyperscope)
				      ("sobjects" . ignore)
				      ("predicates" . ignore)
				      ("uuid2uuid" . ignore)
				      ("relatedhyperdocuments" . hyperscope-see-relationship)
				      ("properties" . rcd-notes-properties-list-by-referenced-uuid)
				      ("statsdefinitions" . rcd-r-statistics-view)
				      ("transactions" . rcd-accounts-transaction-edit)
				      ("messages" . rcd-message-edit-by-id))
"Database UUID action alist."
:group 'rcd
:type '(alist))

And I fully agree with your thinking, even though my example is not
fully aligned with your idea.

> This allows org-roam to store the type of the relationship, A, and the
> value of the relationship, B. So we can make queries like: "all notes where
> idOfTaggedwith = idOfTheConceptOfMusic".

That is good, that is how it should be.

> Implementation (functional on my side. It took me a lot of time, because I
> didn't know the org-mode code. But it's done without too much difficulty I
> think, as it's a link addition). :

Think of implementing it in SQLite or PostgreSQL even better for
future collaborative purposes. 

All becomes easier. Database handles many things for you. Programming
is minimized. Implementation becomes rapid.

> Some problems arise like :
> - org-mode "fits" org-roam, and not the other way around. On the other
> hand, if there is a real use for this kind of link, then org-roam would be
> the one to adapt. (Because a relationship is defined here by a note...
> which is an org-roam note. But that could be a simple id generated by
> org-mode... I don't know. Relationship are perhaps not so
> necessarily id...)

Your thinking is right. 

One thing missing, you speak of single relationship.

In my database documents may be related to other documents, but also
to other people, multiple times. 

Think:

- do you wish to see single relationship between one object and other?
  I have demonstrated how I do it. In fact I get it visually, I press
  "' r" to list relationships for Hyperdocument (object), or in your
  case Org heading, or anything. 

  Relationship names I have defined as following:

   1          Default
   2          COPY OF
   3          RELATED
   4          PARENT
   5          CHILD
   6          SIBLING
   7          FOLLOWS
   8          DEPENDENT

   And I can keep defining relationships between objects.

- But for relationships between objects and people, I have it little
  different:

 1          RELATED
 2          INFORMED BY EMAIL
 3          SUPPLIER
 4          INTRODUCED BY
 5          MAYBE RELATED
 6          WAS ASSIGNED TO
 7          ASSISTED
 8          ATTENDED MEETING
 9          INFORMED BY SMS
 10         REQ-PARTICIPANT
 11         COMES FROM
 12         HOST
 13         BORN THERE
 14         NON-PARTICIPANT
 15         CHAIR
 16         OPT-PARTICIPANT
 17         INFORMED THROUGH THEIR WEBSITE
 18         DELIVERED TO
 19         INFORMED BY XMPP
 20         INFORMED BY PHONE
 21         VISITING

> - My implementation requires a modification of org-mode, which I think is
> not normal. I think it's better add a layer of code with another
> package.

Exactly! Just add the package and connect the dots.

Everything I have explained can also be stored as Emcas Lisp data. No need to use database, but I recommend it strongly.

You can define a hash:

- key is UUID of Org object
- value is UUID of Org related object with description

(setq my-hash
  (let ((hash (make-hash-table :test #'equal)))
   (puthash "2a1d54b6-314f-4209-a096-cdbb1e71663c" (list "5c5d8f53-8f0b-4221-92a5-53f908df557b" "My description") hash)
   (puthash "06b1bd6a-c891-4fc8-9214-08586876f969" (list "5796dfd7-6369-45c1-868a-126d563a219c" "My description") hash) 
    hash)) ➜ #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ("2a1d54b6-314f-4209-a096-cdbb1e71663c" ("5c5d8f53-8f0b-4221-92a5-53f908df557b" "My description") "06b1bd6a-c891-4fc8-9214-08586876f969" ("5796dfd7-6369-45c1-868a-126d563a219c" "My description")))

Verify:
my-hash ➜ #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ("2a1d54b6-314f-4209-a096-cdbb1e71663c" ("5c5d8f53-8f0b-4221-92a5-53f908df557b" "My description") "06b1bd6a-c891-4fc8-9214-08586876f969" ("5796dfd7-6369-45c1-868a-126d563a219c" "My description")))

Store hash:

(defun data-to-file (data file)
  "PRIN1 Emacs Lisp DATA to FILE"
  (string-to-file-force (prin1-to-string data) file))

(data-to-file my-hash "~/my.hash") ➜ "~/my.hash"

Load hash next time:

(defun data-from-file (file)
  "Reads and returns Emacs Lisp data from FILE"
  (condition-case nil
      (car (read-from-string
	    (file-to-string file)))
    (error nil)))

(setq my-hash (data-from-file "~/my.hash")) ➜ #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ("2a1d54b6-314f-4209-a096-cdbb1e71663c" ("5c5d8f53-8f0b-4221-92a5-53f908df557b" "My description") "06b1bd6a-c891-4fc8-9214-08586876f969" ("5796dfd7-6369-45c1-868a-126d563a219c" "My description")))

Verify:

my-hash ➜ #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ("2a1d54b6-314f-4209-a096-cdbb1e71663c" ("5c5d8f53-8f0b-4221-92a5-53f908df557b" "My description") "06b1bd6a-c891-4fc8-9214-08586876f969" ("5796dfd7-6369-45c1-868a-126d563a219c" "My description")))

Continue using the hash for relationships between objects.

Query hash keys to find all relationships.

> In summary, I have several questions:
> - is my idea bad? If yes, why ?

Excellent idea.

That is how it should be. Org author did not go that deep at time of authoring it, it is obvious that it is useful.

Fact is that objects are related to other objects and people as
objects.

Org does not have built-ins for that and I would not do ask for it.

It is good making external package.

> - I'm sure some people have already thought about what I've done. Is
> there an implementation already done ?

In my RCD Notes & Hyperscope for Emacs yes, but that is not Org. It is
meta level system, and Dynamic Knowledge Repository.

About Dynamic Knowledge Repositories (DKR):
https://www.dougengelbart.org/content/view/190/163/

> - How to make this implementation without modifying org-mode, but only
> org-roam? Overwritten functions with modified functions? Like with this
> example: (org-link-set-parameters "id" :follow #'org-roam-id-open), where
> org-roam-id-open is defined in org-roam.

If you need that in Org Roam, then you have to add to Org Roam.

But if you need that function separately from Org Roam then
implementing it by using database or hash stored as file is really not
much work.

I suggest using the built-in SQLite for start.

> - is there another solution to my main problem: making my notes
> - queryable?

My "notes" are just one type of the elementary object. Not everything
is really a "note" by definition. Some objects are "documents", there
are subtypes, etc. Too many intersections.

The more intersections there are defined, the better! Implement and
forget about it. You will thank yourself later.

All my "notes", which I call Hyperdocuments I can query or find by
various means.

The time shows what is most useful. It would depend on users' needs
and habits.

hyperscope-by-action-status-list 	
hyperscope-by-author 	

Above is clear.

hyperscope-by-column (C-c h C)

Above is interesting, it searches by some of allowed columns in database.

12 possible completions:
hyobjects_arguments 	hyobjects_authorname 	hyobjects_description 	hyobjects_internal 	hyobjects_keywords
hyobjects_link 	hyobjects_name 	hyobjects_report 	hyobjects_slug 	hyobjects_text
hyobjects_tmpdoc 	hyobjects_wrsogimage
 	
hyperscope-by-date-created 	

hyperscope-by-hyperdocument-type 	

Types could be defined by user. There are many, depends of the need.

Look here at the combination of types, subtypes and markups:
https://gnu.support/files/tmp/2023-02-14/hyperscope-types-subtypes-markups.html

hyperscope-by-internal (C-c h I) 	

The above search by using internal report, something not for public.

hyperscope-by-language (C-c h G) 	

Finally, links and objects can be in any language, there is one
"Contact us in German" and "Contact us in English", it is not same,
right?

hyperscope-by-markup 	

Searching by markup is not necessary in Org, but Org does not have
expressive markup. There are many issues to it.

How about this one, which can be converted to anything by using
pandoc:

jgm/djot: A light markup language:
https://github.com/jgm/djot

I can mix markups in single document, this is for reason that I use
the:

TECHNOLOGY TEMPLATE PROJECT OHS Framework :
https://www.dougengelbart.org/content/view/110/460/

My objects are separate from single document, and yet I can move them
to Org in blaze, and come back to them.

hyperscope-by-name (C-c h n) 	

That is maybe what you need.

I have also principle of a "Set":

- I can enter into Set, that is equivalent to subtree in Org

- An Hyperdocument can have "Hyperscope ID" type, this means it is
  just pointer or symbolic link to other type, let us say 123

- This means in a subtree I can have new or usually same name for the
  other Hyperdocument.

- That means I can sort in a Set or subtree any kind of Hyperdocuments
  that already exists, or new ones.

- as long as I keep making that order, I can edit single object, and
  such will be propagages automatically to other sets. Change one
  heading in project ABC, and it will be changed in project XYZ
  automatically.

I think this principle of using sets you could use too to get the
types, or subtypes of objects you need.

I do not know if one can "mark" headings in Org, but that would be
great. I am using marking of objects, I can search for example by
tags, or somehow, then I mark, let us say music:

C-h n blues brothers RET

I get this list:

 76601 Blues Brothers List                                ID List          Media Play List             
 74823 Think by Blues Brothers                            Audio            Music                       
 74830 Gimme Some Lovin' by Blues Brothers                Audio            Music                       
 74824 Theme From Rawhide by Blues Brothers               Audio            Music                       
 74828 Peter Gunn Theme by Blues Brothers                 Audio            Music                       
 74825 Sweet Home Chicago by Blues Brothers               Audio            Music                       
 74829 Shake A Tail Feather by Blues Brothers             Audio            Music                       
 74826 Jailhouse Rock by Blues Brothers                   Audio            Music                       
 74821 She Caught The Katy by Blues Brothers              Audio            Music                       
 74827 Minnie The Moocher by Blues Brothers               Audio            Music                       
 74822 Everybody Needs Somebody To Love by Blues Brothers Audio            Music                       
 74831 The Old Landmark by Blues Brothers                 Audio            Music                       
 76267 The Blues Brothers: 11 Behind-The-Scenes Facts About The John Belushi Movie | Cinemablend WWW              Default                     
 76453 The Blues Brothers (1980)                          📁 Directory     Default                     

But then I do not need that directory, maybe I want only three songs,
so I mark them:

⇉74823 Think by Blues Brothers                            Audio            Music                       
⇉74828 Peter Gunn Theme by Blues Brothers                 Audio            Music                       
⇉74826 Jailhouse Rock by Blues Brothers                   Audio            Music                       

And invoke creation of new Hyperdocument by using those marked items:

M-x hyperscope-add-new-id-list-hyperdocument RET

Then I get something similar to this:

 76601 Blues Brothers List                                ID List          Media Play List             

I can then "run" or activate it by "l" (left like in Vim, action
forward), and I would hear those 3 songs.

While that music is playing, I can show how simple is that function:

(defun hyperscope-id-list-action (id)
  (cond ((= (hyperscope-type id) 4)
	 (cond ((= (hyperscope-subtype id) 69) (hyperscope-id-list-play-media id))
	       (t (rcd-warning-message "Did not find action for subtype `%s'" ))))
	(t (rcd-warning-message "Hyperdocument is no ID list."))))

(defun hyperscope-id-list-play-media (id)
  (let* ((id-list (hyperscope-global-marked-items-from-hyperdocument-1 id))
	 (id-list (mapcar 
		   (lambda (id)
		     (let ((file (hyperscope-link-value id)))
		       (cond ((file-exists-p file)
			      (hyperscope-increase-rank id)
			      file)
			     (t nil))))
		   id-list))
	 (media (delq nil id-list)))
    (mapc (lambda (file)
	    (call-process "vlc" nil nil nil file))
	  media)))

So how are you going to relate hyperdocuments to each other? 

By using hand? Manually? 

I would prefer by telling to Org by speaking:

- Relate this heading to "My other heading"

but Org does not understand human voice. What a pity.

I would put cursor in a heading and make function to select one among
other headings, each having UUID, if not, I would place it there.

Then I would store relationship of present UUID for present heading
where cursors is, to the selected one, and I would automatically name
it, or with prefix C-u I would ask user to name it.

hyperscope-by-people-list 	

There are people, we are people, isn't that what matters? We make
notes for people. "People list" is not individual, it is multiple of
people, or company, government department, etc. Searching Headings by
people lists is useful

hyperscope-by-related-contact 	

Any contacts can be related, why not search for it?

hyperscope-by-report 	

Object can be task, task is assigned to person Joe, by author Hans,
and has to be reported to Jimmy, there is description, text and
report, and chunked reports. Searching by report is very important. 

hyperscope-by-slug (C-c h J) 	

Those things for Internet. I use it more often. Why not search for
"scribd.com" when I need it.

By the way, I made the scribd.com type of links to be opened by
"Scribd Downloadere" if user wants.

hyperscope-by-tag (C-c h t) 

This I use often.	

hyperscope-by-text 	

That is clear.

hyperscope-by-type-and-column 	

For example, you want Music by author, directory by name, or Gnumeric
spreadsheet by report.

Combinations in searching will help user to get better intersection results.

hyperscope-by-type-with-action 	

How about "Task COMPLETED", or "Music PENDING"

hyperscope-hyperdocuments-by-action 	
hyperscope-hyperdocuments-by-size 	
hyperscope-hyperdocuments-by-timestamp 	

Timestamps are other sub-objects, each can have description, activity,
etc.

10 possible completions:
ACTION [5] 	ACTION-REMOVED [7] 	CLOCK-IN [3] 	CLOCK-OUT [4] 	COMPLETED [6]
DEADLINE [2] 	FOLLOW-UP [11] 	MEANWHILE [12]
RE-ASSIGNED [13] 	SCHEDULED [1]

hyperscope-list-by-contact 	

All objects by contact

hyperscope-tags-by-type

There are different tag types, one is for industry, other is for
skills, is not same all in one.

hyperscope-by-argument				    

Arguments I use flexibly as they depend on the type, subtype. Imagine
those search engines, like the first one most important one:

 78835 The Pirate Bay                                     Web Server Query Default                     
 78669 Duck Duck Go!                                      Web Server Query Default                     
 78675 Reasonator                                         Web Server Query Default                     
 78673 Wikipedia (English)                                Web Server Query Default                     
 78674 Wikinews (English)                                 Web Server Query Default                     

Then there is argument:

https://thepiratebay.org/search.php?q=%s&all=on&search=Pirate+Search&page=0&orderby=

which is in this case Emacs Lisp format which will be replaced with
the query.

In fact when I place that link in Org, when I wish to click on it, I
am asked for query, search engine opens automatically on it.

But in "Hyperscope ID" type, there will be just integer like 123
pointing to other Hyperdocument.

hyperscope-by-author-name	

Clear.
		    
hyperscope-by-country				    

Yes, objects are related to countries, very necessary.

hyperscope-by-description (C-c h D)		    

Description is just one part of text properties of object.

hyperscope-by-hyperdocument-subtype		    
hyperscope-by-hyperlink-type			    
hyperscope-by-keywords				    

That is for Website Revision System keywords, for HTML pages mostly.

hyperscope-by-link (C-c h k)			    

Very often used to find by link. Implement yourself.

hyperscope-by-markup-and-column		    

You want maybe Asciidoctor by name, or Org markup by description?

hyperscope-by-people-id			    

Searching by ID of people.

hyperscope-by-rank				    

Show those most activated documents first.

hyperscope-by-relation-type			    
hyperscope-by-set (C-c h E)			    

Sets have their names, that is like subtree heading, easier to find
those who are true heading of subtrees, not all are.

hyperscope-by-subtype (C-c h B)		    
hyperscope-by-temporary-document		    

There are "temporary" documents, like PDF file can have extract of
text in that property, and why not search for text from PDF file? It
is logical. But temporary document may look ugly. However, searching
through PDF files would be more difficult directly.

hyperscope-by-type (C-c h T)			    
hyperscope-by-type-and-subtype			   

Combine types and subtypes, that is probably what you need.
 
hyperscope-by-wrsogimage			    

HTML pages on Internet have schema, so those images that appear as
preview are there.

hyperscope-follow-ups-by-persons-country	    

You are to see list of objects related to people, in different
countries. 

hyperscope-hyperdocuments-by-query-but-not-in-set  

General search, just exclude the set!

hyperscope-hyperdocuments-by-template		    

Objects may use templates for their representations, find those using
ABC template.

hyperscope-hyperdocuments-pending-by-assignee	    

Too many tasks pending by assignee, so find those pending.

I hope that gave you ideas for implementation of new package of Org
relationships.

> - Some people often have subjects related to this type of question
> (I think in particular of a certain "Jean Louis"): have you found
> better solutions?

I did not read that until I came to it, but thanks.

I need relationships between documents. That is a must:

- if page is published, and related hyperdocuments are also
  "publishable" they are shown in export on the HTML page or PDF page,
  etc. No thinking about it.

- if page is duplicated from previous Hyperdocument, that new one
  automatically become "CHILD", thus related to previous one.

It also includes relationships to various other "properties" or
"attributes". The more, the better.

Doing that in Org directly is overkill. 

But using UUID and putting relationships on that UUID may be
practically implemented within minutes.

If user is Org centric, and needs various properties not otherwise
implemented in Org, then using UUID can provide such feature easy, and
then you can also search between documents.

You can for example, update Org heading, and later just have function
updating all names of headings to their corresponding UUID in the
database.

I would stick to only this:

* My heading
  :PROPERTIES:
  :UUID:     282f7242-a3b1-4bd6-94b6-7283303ae7ed
  :END:

And I was exploring option to make it invisible.

That way, user can edit that heading, and because of relationship to
database or stored hash database or other type, any kind of properties
can be stored.

The more various types of properties are there, the easier will be the
query in future.


-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Link type in org-mode, but with org-roam ?
  2023-02-13 16:05 Link type in org-mode, but with org-roam ? Cletip Cletip
  2023-02-14 10:41 ` Jean Louis
@ 2023-02-16 12:44 ` Ihor Radchenko
  2023-02-16 20:40 ` Jean Louis
  2 siblings, 0 replies; 6+ messages in thread
From: Ihor Radchenko @ 2023-02-16 12:44 UTC (permalink / raw)
  To: Cletip Cletip; +Cc: Org Mode List

Cletip Cletip <clement020302@gmail.com> writes:

> As you know, external links can be of the form "X:path", where X equals id,
> file, gnus etc. Note: Org-roam stores all types of links.
> So we can make the following type of links:
> [[A:B][description]]
> where
> - A is the id of a note known by org-roam
> - B is the id of a note, or string, or numeric value, etc
> - description is a description (what a precision)

Instead of hacking into Org source, you can define a new link type as
[[rel:A:B][description]] and set :follow and other parameters are needed.

> - is there another solution to my main problem: making my notes queryable ?

Try https://github.com/alphapapa/org-ql It provides much more flexible
query syntax where you can match against metadata values.

-- 
Ihor Radchenko // yantar92,
Org mode contributor,
Learn more about Org mode at <https://orgmode.org/>.
Support Org development at <https://liberapay.com/org-mode>,
or support my work at <https://liberapay.com/yantar92>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Link type in org-mode, but with org-roam ?
  2023-02-13 16:05 Link type in org-mode, but with org-roam ? Cletip Cletip
  2023-02-14 10:41 ` Jean Louis
  2023-02-16 12:44 ` Ihor Radchenko
@ 2023-02-16 20:40 ` Jean Louis
  2023-02-21 16:17   ` Cletip Cletip
  2 siblings, 1 reply; 6+ messages in thread
From: Jean Louis @ 2023-02-16 20:40 UTC (permalink / raw)
  To: Cletip Cletip; +Cc: Org Mode List

* Clément Payard <clement020302@gmail.com> [2023-02-16 13:16]:
>  First of all, thank you for your answer.
> 
> Sorry, I am not a researcher :(. I'm just a modest student with a passion
> for emacs, org-mode and PKM environment. So I'm not a big thing ^^. But I
> think I have a working brain and good ideas... so here I am.
> The perfect system as I described it does not exist. I've been "looking"
> for... 6 or 7 months ? Whatever, I think I'll get to the end of this
> search.

I was referring to researcher in the definition of what you do,
investigating, researching about note taking. Now I realize that the
word is used almost exclusively for scientists.

> But, before talking about anything, I would like to know several
> things:

> - I've heard of Hyperscope before your previous message. I mean, I've looked
> at some of your posts and (I think) videos... but I still don't understand
> where to find it. Can't use it / test it. I think this is on purpose, you
> didn't finish it.

Yes, I have that problem that database tables are really very dynamic
and not well polished to just give them to people. And software is
also not polished, it has some hard coding that I have to modify.

Yes, I am very slow in providing public package for RCD Notes &
Hyperscope for GNU Emacs.

But I am very willing to help you install it and try it all out and
make it workable on your computer, in one on one chat or by e-mail,
that will work well.

I strongly suggest reading and understanding this system:

GeDaFe - PostgreSQL Generic Database Interface:
http://gedafe.github.io/doc/gedafe-sql.en.html 

As the database is based on that design. Design of program basically
says:

- design the database table by GeDaFe schema

- let system provide functions like add, modify, delete, duplicate
  automatically

> I only found this:
> https://hyperscope.link/3/7/1/5/5/RCD-Notes-for-Emacs-37155.html ,
> which gives a link to get "rcd-cf", which works at my place (after
> installing the "emacs-libpq" dependency). I just don't know how to
> use it... Is there a tutorial I can do somewhere? Explanations
> somewhere?

Ehm. I am not Drew Adams to have it all ready since decades.

I am working from time to time on documentation and want to make it
exteremely easy to install it.

One part of it I almost ported to SQLite for people management, but
have to polish functions. It just starts working with the Emacs SQLite
built-in.

So I need to set it up that for user it "just works" for PostgreSQL.

> - Second thing, your system seems extremely flexible and adaptable

Which is good. It is based on GeDaFe, which means, user is able to add
any table, and continue managing information by using same system.

> but it also seems terribly rigid.

That may be opinion. 

What is rigid are only relationships, I can say what is rigid:

- column timestamp are rigid, they will accept only specific time
  stamps, and will be automatically generated mostly

- referenced columns are rigid, I can relate note only to person which
  exist in the database. I cannot relate it to person that does not
  have an entry in the database. If I wish to do so, than I would
  write it in the text of the entry. But cannot relate it in the
  database.

- column types are rigid, for example ID is integer, I cannot write it
  as text, UUID must be UUID and must conform to the format, I cannot
  write integer for UUID.

Apart from those rigid principles, nothing else is rigid that I know,
at least by feeling, without knowing exactly what you mean.

> I don't know what your goal is exactly, but my goal is to make a
> system that is easy to use, where the information doesn't have to be
> arranged perfectly.

Goals are defined in features:

RCD Notes & Hyperscope for GNU Emacs, The Dynamic Knowledge Repository:
https://gnu.support/gnu-emacs/rcd-notes-for-gnu-emacs/index.html

Some of main goals are sales, or helping people, or moving people from
one stage to other stage. 

Imagine some sales flow like:

10, Client has received the offer online                                            
20, Client engages in conversation and resolves all questions and doubts                    
30, Client arranges the meeting
40, The agreement proposal is sent to client                                                
50, Client may propose modifications to the agreement                                       
60, Client signs up the agreement and pays 
70, Service delivered

Then person is moved from one stage to other by using communication
and documents.

Similar "flows" can be applied with patients in a hospital, or orphan
child in Tanzania, or development of a school in Uganda.

This system overall is used for planning in order to reach goals and
purposes. We manage resources, inventory, their locations, geographic
locations of resources, maps, people, their locations, their
expenditure, reports, plans, programs, projects, tasks, all with
purposes of delivering valuable final product.

However, system can be used to play Blues Brothers or Red Hot Chilli
Peppers. It may be used to quickly find some relevant information and
help others find references, such as from Gutenberg, or knowledge
libraries.

It may be used as communication center, call center, Customer
Relationship Management. 

Too many things to even describe at once.

> The problem is that if I don't set up "templates", things always in
> the same place, with always the same structure, I won't be able to
> have queryable information (because how find the information if it's
> not the same format/place ?).

I think with "templates" you refer to structure of database table. You
may try using function M-x cf-sql-table as it is Emacs skeleton to
help with database table creation.

Within seconds I create this below:

-- ------------------------------------------
-- ------------ Table notes
-- ------------------------------------------
DROP SEQUENCE notes_id_seq;

CREATE TABLE notes (
notes_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
notes_uuid UUID NOT NULL DEFAULT gen_random_uuid(),
notes_datecreated TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
notes_datemodified TIMESTAMP WITH TIME ZONE,
notes_usercreated TEXT NOT NULL DEFAULT current_user,
notes_usermodified TEXT NOT NULL DEFAULT current_user,
notes_name TEXT NOT NULL,
notes_description TEXT
);

GRANT ALL ON notes TO PUBLIC;

DROP VIEW notes_combo;
CREATE OR REPLACE VIEW notes_combo AS
SELECT notes_id AS id,
notes_name AS TEXT
FROM notes;

GRANT SELECT ON notes_combo TO PUBLIC;

COMMENT ON TABLE notes IS 'Notes';

COMMENT ON COLUMN notes.notes_id IS 'ID';
COMMENT ON COLUMN notes.notes_uuid IS 'UUID';
COMMENT ON COLUMN notes.notes_datecreated IS 'Date created';
COMMENT ON COLUMN notes.notes_datemodified IS 'Date modified';
COMMENT ON COLUMN notes.notes_usercreated IS 'User created';
COMMENT ON COLUMN notes.notes_usermodified IS 'User modified';
COMMENT ON COLUMN notes.notes_name IS 'Name';
COMMENT ON COLUMN notes.notes_description IS 'Description';

-- CREATE UNIQUE INDEX notes_index ON notes ( notes_name );

-- INSERT INTO notes (notes_name) VALUES ('');
-- INSERT INTO meta_tables VALUES ('notes', 'hide', '1');

-- Triggers
-- For Date Modified
CREATE TRIGGER notes_moddatetime
BEFORE UPDATE ON notes
FOR EACH ROW
EXECUTE PROCEDURE moddatetime(notes_datemodified);

-- For User Modified
CREATE TRIGGER insert_username_notes
BEFORE INSERT OR UPDATE ON notes
FOR EACH ROW
EXECUTE PROCEDURE insert_username(notes_usermodified);

So the above is "template" in the database, it defines which types of
entries are there. "Notes name" is always string, cannot be number,
but it can be string having number. 

That is simple example.

In my workflow, when developing new database table I do this:

(rcd-db-create-table "newtable" MY-HANDLE)

Then I start adding some items, then if I feel I need new column, I do
that interactively in Emacs.

I think everything should be interactive and easily integrated for
user, I am working on it.

It should be M-x rcd-db-create-table interactively, and not only as
function.

> So I decided that only certain information would be queryable,
> information that I judge to be useful.

Everything may be queried. With PostgreSQL you may add column for
"tokens", and then get full text search, which means, you could push
all of the column values into those tokens, and have PostgreSQL handle
queries for you. This is very useful feature.

Hyperscope full text search with PostgreSQL:
https://hyperscope.link/3/6/7/6/8/Hyperscope-full-text-search-with-PostgreSQL-36768.html

PostgreSQL: Documentation: 15: Chapter 12. Full Text Search:
https://www.postgresql.org/docs/15/textsearch.html

Currently I have 64+ ways of searching for information. 

My experience tells me you should develop in structured way.

Do not use "First name, last name", but use:

- "First name"
- "Middle name"
- "Last name"

as 3 fields. Same principle shall apply for other information. If you
have "Date, note name" as mixed string, better separate "Date" from
"Note name".

Structure and add properties.

After a while you may do intersections and query by means possible
ways. It becomes Dynamic Knowledge Repository, when system become
capable to represent the needed knowledge for human and help human
move in processes of life.

> A new piece of information that I don't need to be queryable, but
> just need to be found, will therefore be very easy to store.

For me I can query anything, I can find anything. I do not know what
you mean with "to query" versus "to find".

> The problem and the great weakness of such a system is that I have
> to define the queryable information in advance.

No, you need not think of that. Do you use database?

I am not thinking in advance about "queryable" information. I am
thinking of structure, or types, and do not worry of future. All
types, columns, anything is automatically capable to be queried.

Here is example of addresses structure:

                                                   Table "public.addresses"
┌─────────────────────────┬──────────────────────────┬───────────┬──────────┬─────────────────────────────────────────────────┐
│         Column          │           Type           │ Collation │ Nullable │                     Default                     │
├─────────────────────────┼──────────────────────────┼───────────┼──────────┼─────────────────────────────────────────────────┤
│ addresses_id            │ integer                  │           │ not null │ nextval('addresses_addresses_id_seq'::regclass) │
│ addresses_datecreated   │ timestamp with time zone │           │ not null │ CURRENT_TIMESTAMP                               │
│ addresses_datemodified  │ timestamp with time zone │           │          │                                                 │
│ addresses_usercreated   │ text                     │           │ not null │ CURRENT_USER                                    │
│ addresses_usermodified  │ text                     │           │ not null │ CURRENT_USER                                    │
│ addresses_people        │ integer                  │           │          │                                                 │
│ addresses_addresstypes  │ integer                  │           │ not null │ 1                                               │
│ addresses_name          │ text                     │           │ not null │ 'Address'::text                                 │
│ addresses_line1         │ text                     │           │          │                                                 │
│ addresses_line2         │ text                     │           │          │                                                 │
│ addresses_line3         │ text                     │           │          │                                                 │
│ addresses_city          │ text                     │           │          │                                                 │
│ addresses_region        │ text                     │           │          │                                                 │
│ addresses_postcode      │ text                     │           │          │                                                 │
│ addresses_countries     │ integer                  │           │          │                                                 │
│ addresses_datevalidated │ timestamp with time zone │           │          │                                                 │
│ addresses_locations     │ integer                  │           │          │                                                 │
│ addresses_description   │ text                     │           │          │                                                 │
│ addresses_inactive      │ boolean                  │           │          │                                                 │
│ addresses_default       │ boolean                  │           │          │                                                 │
│ addresses_uuid          │ uuid                     │           │ not null │ gen_random_uuid()                               │
└─────────────────────────┴──────────────────────────┴───────────┴──────────┴─────────────────────────────────────────────────┘
Indexes:
    "addresses_pkey" PRIMARY KEY, btree (addresses_id)
    "addresses_addresses_uuid_key" UNIQUE CONSTRAINT, btree (addresses_uuid)
Foreign-key constraints:
    "addresses_addresses_addresstypes_fkey" FOREIGN KEY (addresses_addresstypes) REFERENCES addresstypes(addresstypes_id)
    "addresses_addresses_countries_fkey" FOREIGN KEY (addresses_countries) REFERENCES countries(countries_id)
    "addresses_addresses_locations_fkey" FOREIGN KEY (addresses_locations) REFERENCES locations(locations_id)
    "addresses_addresses_people_fkey" FOREIGN KEY (addresses_people) REFERENCES people(people_id)
Referenced by:
    TABLE "commlines" CONSTRAINT "commlines_commlines_addresses_fkey" FOREIGN KEY (commlines_addresses) REFERENCES addresses(addresses_id)
Triggers:
    addresses_moddatetime BEFORE UPDATE ON addresses FOR EACH ROW EXECUTE FUNCTION moddatetime('addresses_datemodified')
    insert_username_addresses BEFORE INSERT OR UPDATE ON addresses FOR EACH ROW EXECUTE FUNCTION insert_username('addresses_usermodified')

And here is list of address types:

 1          Default address
 2          Billing Address
 3          Shipping Address
 4          Registered Address
 5          Work address
 6          Mailing address
 7          Post Box Address
 8          Origin addresss

Because of the design of tables, and conditional correct entries into
the database, it becomes very easy to find for example "POST BOX"
address of all people in Mwanza city.

But if I would not define address types, I would have more serious
problem to find those post box addresses.

> Whereas you may have the opposite problem: every piece of
> information is queryable, but a new piece of information takes a
> long time to put away.

I do not understand "put away", is it to "remove it"? I do not
understand the problem.

> You can't just put information down like that (maybe I am wrong,
> maybe you can. But from what I understand, no). And that's the
> dilemma: either you make something extremely rigid, but "queryable",
> i.e. you can query the system itself with requests.

Making database based structure of objects is to many degrees way more
beneficial than having it without structure.

> Or we do something extremely flexible, exactly like a big org-mode
> file where we just put the information, and the user can use his
> method (grep for example).

For single user that may be fine. For collaborative work, multi-user
access is not, or sharing of information, it is not. That is why Org
development strive to provide more and more structure, something I
said, they try to make it like a database, but because there is no
structure, it becomes the never ending story of milions of bugs.

> For me, the perfection was between the> two, exactly what org-roam
> offers: org-mode + database in the background for some operations.

I wish I could try org-roam, but I get error, so I follow instructions
and cannot install it.

In my work I use meta level. First I am liberated from Org mode, or
any kind of mode. And I like flexibility to mix various markups. I can
use universal hyperlinks that convert themselves into necessary
markup. I don't like being dependent on some "mode".

If markup is Org, hyperlink will become Org hyperlink, if markup is
Markdown, hyperlink will become Markdown link, if it is text, it will
be shown in text. Why do I need to record 3 versions of same document,
better one, which can be just represented in different way.

> All this to get to the next thing: AI. I can give my notes, which
> are very flexible, to ChatGPT, and ask it complex questions about
> the notes

I would never give my information to outside companies I do not
know. 

I understand you. Though I do not see personal use of it.

> So, my big question: aren't our respective (mine with org-roam +
> org-roam + metadata, and yours with Hyperscope) systems already
> obsolete?

Maybe you wish to say how artificial intelligence could replace many
systems. Though personally I do not see how present state of AI would
know what I need. I can definitely think that my program could get
some functions "to see the patterns" and then help me create let us
say new sets. And program without artificial intelligence can tell me
who has got birthday today, or tomorrow, to help with relationships,
or it can tell which person received information X, so that person can
be called to be given information Y, moving person from one stage to
other. Those simple serial intelligent detection and reminders may be
programmed.

> Is it useful to make such a complex system when maybe in 2 years
> time an open source AI will be able to understand 95% of the
> questions asked?

Maybe, however, you compared things which are not comparable. 

> I've chosen my side: I'll wait for the release of an AI, and I
> remain flexible, without breaking my head to make the ideal
> database, with the ideal links and the ideal notes.

There is no ideal.

In fact, my side everything started with GeDaFe and function 
M-x cf-sql-table and it is very dynamic, changeable, over time it get
better and better, more useful, perfected.

Once system is there so automatically provide interface for ANY kind
of database tables, then person can practically do anything with
it. On each entry make some function you need, and upgrade with
time. It becomes personal extension, cyborg like.

> On the other hand, I am capable of listening to you and changing my
> mind if you think that your method, rigid and based on databases, is
> viable and brings a plus in the long term despite the arrival of the
> AI.

I can't tell what it brings to you, as I said, it is very personal,
though it does go towards common found purposes, such as Customer
Relationship Management.

> - Finally, I need some clarifications on some points, but maybe I just
> misunderstood:
>   - you put "types" and "subtypes"... why? To take your example with Music
> and Country, why not define, in the "node" / heading / Hyperdocument the
> term "Country", and say that it is a subclass of music? (with a particular
> type of link for example). A bit like wikidata.

I understand you, and that is quite possible. Though not same.

Purpose of types is to understand type of object, subtype describes
purpose of the object.

If type is spreadsheet, subtype may say it is "Financial Plan".

On my side, the type:

- can have embedded Emacs Lisp, it means, user can say how is this
  type handled, activated, 

- it can have different available Emacs mode, that is property of type 

- it may have multiple minor modes

- designation if it is file, or database object for computer to know
  how to handle it

- template 

- 3 tags that are automatically assigned to all of those objects of
  that type

- priority

- embedded key for dynamic keymap (not programmed, but user defined)

- "Activity" signal, as what is active is similar to task, meeting,
  something "TO DO", what is not active is not considered for actions

- foreground, background color, fancy name for presentations

- next activity type, because some things like task, can be followed
  up with "follow-up" type, or similar

and unlimited other properties that I can add over time. Those
properties of the type I cannot add in a single string where I am to
write two words, similar like categories. And writing of a name by
hand is not my choice, I choose types much quicker.

Subtype of document is something like stronger tag, but not floating
tag, it is more rigid. For example "Document, Loan Request" would give
quite clear intersection of such documents.

Subtypes also have properties, though are not considered as strong as
types. 

> - what is the differences between ID and UUID in your system ?

ID is local to the database, while UUID is general. By using UUID, it
is possible to export the object, without ID, and import to other
database, creating there maybe different ID, however, because of the
UUID, both parties would know we are dealing with same person Joe Doe,
or referring to same object.

ID is used as primary key and it is easier to sort items by integer
then by UUID.

And UUID I use as universal hyperlink, very handy.

Think of Org, instead of:

#+BEGIN_SRC my-program
(defun hyperscope-list-tokens-not-updated ()
  "List Hyperdocuments without full text searcch tokens."
  (interactive)
  (let* ((sql "SELECT hyobjects_id FROM hyobjects WHERE hyobjects_tokens IS NULL ORDER BY hyobjects_rank DESC")
	 (id-list (rcd-sql sql hs-db)))
    (hyperscope-by-id-list id-list "No hyperdocuments found without updated tokens.")))
#+END_SRC

I could use this:

⟦ (uuid "dccbe9ff-9c5f-4b02-919e-0849cf272707") ⟧

and by clicking on the above UUID I would find me in different object,
editing that above function. It would interpolate it's result in the
source object.

Or I could do this:

#+BEGIN_SRC my-program
(uuid-link "dccbe9ff-9c5f-4b02-919e-0849cf272707")
#+END_SRC

and similarly, by clicking on the above UUID, I would find me in
different environment, edit Babel program and come back.

Or I can use universal hyperlink, like

hyperscope:d7c8d51f-ffaa-4ffc-bb3e-627d048b4c02 in Org, or HTML, or in
PDF, which brings me back to Hyperdocument in computer.

This is very practical, we have already many projects printed, or as
PDF, where user can just click back and forth to task, and back to
Table of Contents, or just by clicking straight to Emacs to edit the
people entry, or Hyperdocument entry.

I did not yet make experimental or demonstration of it, but we use it
in business managing thousands of dollars and people on different
parts of country and world this way.

>   - your links have uuid, it's an "own entity", an "Elementary Objects". I
> think this is great on paper, really. The problem: Doesn't it become too
> complicated to manage the types of links and all the relation possible
> between two Hyperdocument ?

What is complicated is writing documentation about it.

It is not complicated managing relations between hyperdocuments or
people. 

- "c c" is for "duplicate" Hyperdocument, new document get
  automatically CHILD relationship to PARENT

- there is function to relate selected (with cursor) Hyperdocument to
  other Hyperdocument, by using completion

- there is function to relate visible Hyperdocuments in a list to each
  other

- there are functions to relate people to Hyperdocuments

I understand that it can all sound difficult, but practically, I can
teach new person in 10 minutes the work, and person will
perform. There is nothing special to it. It is very integrated now.

When I look in the database, I have 8771 not-unique people related to
Hyperdocuments, that many relationships are inside. But does it
matter? The number sounds overwhelming and it does not matter!

What matters is the specific, not general information.

- I get idea that I have to inform client about basic principles of
  business XYZ, and it is associated with word "establishment" by
  using "C-c h n"

- I write "establish" RET and get 32 results

- The most referenced Hyperdocument is WWW hyperlink, and it is on
  first place

- I find the set on 2nd place, arrow down and right or "j" and "l" and
  I enter in the set (key binding similar to Vi)

- I find document I want to share to client

- but did I share it already? I do not remember, so I press keys "s r"
  to see relationships to people.

- I see that his name is not in list of people who got the document,
  and I share it to client with "h s" and choosing client's name

- Document is now automatically related to that person with relation
  "INFORMED BY EMAIL" and relation type can be anything

It is matter of habit. Just like all other keys in Emacs, one get the
habit and it works well.

>   - I have absolutely no idea what Hyperscope, rcd and org-mode have to do
> with it. I'm trying to understand, watching your video... but nothing. I
> understand only the general idea.

I can totally understand you. I am well aware that it is so. Even if
documentation would be there, I would understand.

Let us say I have a technical hobby and 15000 PDF references to
various technical articles, nicely indexed. In this case system is
used for learning, without reading or wasting time on pages which are
not essential. Only what is essential can be quickly selected or
referenced, or new lists of PDF or WWW presentations formed out of
it. Project assignments can be formed out of it.

Maybe I wish to find quicker books in Gutenberg library, so I do that
function. 

Maybe there are teams of people, I assign them tasks, but then system
generates automatically the project structure with all tasks inside,
so the PDF document can be printed and be given to all people in
transparent way, to know which person is assigned to what task.

What does Org mode has with it? Nothing fixed. I can write anything in
Org mode, or in other markup, it is multi markup system, I can mix
markups, as objects are separated, they are not in one file. Write
task in simple text, OK, it will be embedded, but maybe not so nice
looking as written in Org or LaTeX. It is something that user may
define, it is a table of markups.

 1          Text to text
 2          Text to HTML (body only)
 3          Text to PDF
 4          Text to text with lines joined
 5          Discount Markdown to HTML
 6          Discount Markdown to text
 7          txt2tags to HTML
 8          Org to HTML
 9          Markdown (Discount Markdown) to Asciidoc
 10         Markdown (Discount) with Table of Content to PDF
 11         Text to LaTeX
 12         Markdown (Discount) with Table of Content to HTML
 13         txt2tags to LaTeX
 14         Text to HTML (with full page and template)
 15         Asciidoctor to HTML
 16         Wikitext to HTML
 17         Asciidoc to HTML
 18         Asciidoc to LaTeX (body only)
 19         Org to LaTeX (body only)
 20         Djot to HTML
 21         Asciidoctor to Text
 22         LaTeX to PDF
 23         Org to PDF
 24         Text to HTML (preformatted)

You can then imagine that objects can have different markups, or none,
plain text, and they can be converted to some other main markup.

> To take the example of org-roam, we have: org-mode which is
> plain-text.

For me it is not "plain text" no matter how someone call it. It is
structured, and cannot be used actively without being
structured. 

It has deceptive motto that it is "plain text". Then I could say for
XML that it is also "plain text", well that is not quite so. It must
have expected structure to be Org text.

Plain text has no relation to a program, it is plain.

> org-roam allows to store in a database some information present in org-mode,
> like the title, the links etc. Then, when searching, we rely on this
> information and this database. But the useful information itself is often
> underneath this database layer: these are the org-mode files.

I can't assimilate to those approaches. I have tried and used Org
successfully until the point of realization that it does not scale
well. My needs are different. 

Number of my Maildirs is 59934. That is number of people I have
communicated to or number of conversations. The program "mu4e" can't
handle that, it does not work, it gets stuck forever, author admitted
it can't. There is 240676 people in the database. I cannot handle that
with any other software, and they are tied to marketing efforts. 53131
Hyperdocuments are there.

GeDaFe taught me to go with easy approach, and so I use the principles
of GeDaFe for long time. Create database table as I wish, manage it
automatically. 

> I was going to launch into a paragraph of theory but I don't think
> that's useful: it will be wrong and will waste writing time for me
> and reading time for you. Anyway: what is the link between your
> differents "layers", that is : Hyperscope, rcd, databases, org-mode,
> etc ? Who does what, and how?

They may be layers for you, I do not see it as such. Database is for
ordered storage, I do not think of it. Org mode is just one of
multiple markups which I can use, I can use any markup. Major point is
communication with people that is why all those Hyperdocuments are
there and people management. 

I can give practical example:

- local chairman is found on ground

- we greet chairman, and collect full contact information (CRM + Hyperscope)

- we find his house, and record GPS position (not all countries have
  street numbers) (geographic locations table)

- team member quit and goes to other company

- new team member is assigned

- chairman and all actors in the village are exported and given as
  information to team member

- team member knows background of the chairman, could be mean person,
  or get information how to handle him

In that practical example knowledge is used to smooth the future
processes of the business.

Design is described here:

TECHNOLOGY TEMPLATE PROJECT OHS Framework :
https://www.dougengelbart.org/content/view/110/460/

Reasons or purposes are described here:

About Dynamic Knowledge Repositories (DKR):
https://www.dougengelbart.org/content/view/190/163/

The CODIAK Process Cluster: Best Strategic Application Candidate6:
https://www.dougengelbart.org/content/view/116/#6

,----
| The concurrent development, integration and application of knowledge.
`----

,----
| Intelligence Collection: An alert project group, whether classified as
| an A, B, or C Activity, always keeps a watchful eye on its external
| environment, actively surveying, ingesting, and interacting with
| it. The resulting intelligence is integrated with other project
| knowledge on an ongoing basis to identify problems, needs, and
| opportunities which might require attention or action. 6g1
`----

,----
| Dialog Records: Responding effectively to needs and opportunities
| involves a high degree of coordination and dialog within and across
| project groups. This dialog, along with resulting decisions, is
| integrated with other project knowledge on a continuing basis.
`----

,----
| Knowledge Product: The resulting plans provide a comprehensive picture
| of the project at hand, including proposals, specifications,
| descriptions, work breakdown structures, milestones, time lines,
| staffing, facility requirements, budgets, and so on. These documents,
| which are iteratively and collaboratively developed, represent the
| knowledge products of the project team, and constitute both the
| current project status and a roadmap for implementation and
| deployment. The CODIAK process is rarely a one-shot effort. Lessons
| learned, as well as intelligence and dialog, must be constantly
| analyzed, digested, and integrated into the knowledge products
| throughout the life cycle of the project
`----

That description is accurate, that is exactly what is taking place. It
is evolving, dynamical knowledge, that results with the purposes.

,----
| The Community's basic knowledge products could be viewed as dynamic
| electronic handbooks on "how to be better at your improvement tasks,"
| with two customer groups: its B-Activity customers; and the C
| Community itself. Pooling resources from the member organizations
| enables a more advanced and rapidly evolving prototype CODIAK
| environment, which serves two very important purposes:
| 
| 1. It provides for the Community getting better and better at its
| basic "C Activity;"
| 
| 2. It provides advanced experience for its rotating staff of
| participants from the member organizations. They thus develop real
| understanding about the real issues involved in boosting CODIAK
| capability - this understanding being absorbed by "living out there in
| a real, hard-working CODIAK frontier."
`----

By looking into principles of Doug Engelbart, I can see how it has to
be developed. 

And I am not doing it for sake of development per se.

I must do it for sake of getting things done.

My "things" involve handling complex relationships with people,
meetings, understanding people's goals, purposes, policies, complying
to their viewpoints (it involves good dose of pretending), solving
issues, and making agreements.

I can track it on paper, but I get some problems with it, so that is
why we track in the database, and move people and processes from one
stage to other stage towards goals and purposes.

-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Link type in org-mode, but with org-roam ?
  2023-02-16 20:40 ` Jean Louis
@ 2023-02-21 16:17   ` Cletip Cletip
  2023-02-22 19:30     ` Jean Louis
  0 siblings, 1 reply; 6+ messages in thread
From: Cletip Cletip @ 2023-02-21 16:17 UTC (permalink / raw)
  To: Cletip Cletip, Org Mode List

[-- Attachment #1: Type: text/plain, Size: 44738 bytes --]

>
> But I am very willing to help you install it and try it all out and
> make it workable on your computer, in one on one chat or by e-mail,
> that will work well.


Yes, I'd be very happy to try it. Contact me by email when you have time. I
am available on weekends. I would definitely prefer a call to be able to
exchange easily, via the application you want.

> The problem and the great weakness of such a system is that I have
> > to define the queryable information in advance.


> No, you need not think of that. Do you use database?

I am not thinking in advance about "queryable" information. I am
> thinking of structure, or types, and do not worry of future. All
> types, columns, anything is automatically capable to be queried.


I was talking about my system which was made with org-roam, so the
information stored in the notes is in plain text. But, to make them
queryable, I have to add "metadata" as said before with key-value.
So I'm using a database, but I don't want to bother thinking about how I
can add new information to my system. You, you need to think about "what
describes this information?" If it's someone, you create a new table (not
sure if this is this term to use) to hold that knowledge.
I don't want to think about that, I just want to put the information in and
find it without thinking about tables.

Because of the design of tables, and conditional correct entries into
> the database, it becomes very easy to find for example "POST BOX"
> address of all people in Mwanza city.


Here, everything is queryable, because you have already thought of all the
possible cases that could happen. In my system, I decided to do the
opposite: why think of a particular case if I'm not even sure I'm doing it?

But our goals are not the same, you have to have a solid system for several
people, I do something much more personal. So, it's ok.

> Whereas you may have the opposite problem: every piece of
> > information is queryable, but a new piece of information takes a
> > long time to put away.


> I do not understand "put away", is it to "remove it"? I do not
> understand the problem.


Sorry bad translation.
I wanted to say that adding a new type of information can be time
consuming: you have to add the table, and above all check that another
table does not already exist to do the same thing.
So you need excellent documentation, hoping that the system itself doesn't
become too "cluttered" for the user.

> You can't just put information down like that (maybe I am wrong,
> > maybe you can. But from what I understand, no). And that's the
> > dilemma: either you make something extremely rigid, but "queryable",
> > i.e. you can query the system itself with requests.

Making database based structure of objects is to many degrees way more
> beneficial than having it without structure.


For your purpose, yes. For mine, no. I think that every thing that has to
have a special presentation / type in the database is an exception: the
user has to think / look that, if he wants to add a contact, he has to look
for the type "contact".
I would like my system to detect by itself that when I give a node/heading
org-mode as title "A-name A-forname", it understands by itself that it is a
contact. And if I put a phone number underneath, I can just ask him "give
me the phone number of X", and he gives it to me correctly.

I repeat because I don't want to offend you: we don't have the same goals,
so it is normal that our methods are different.
On the other hand, I would very much like to test your method, it intrigues
and interests me a lot.


> > Or we do something extremely flexible, exactly like a big org-mode
> > file where we just put the information, and the user can use his
> > method (grep for example).

For single user that may be fine. For collaborative work, multi-user
> access is not, or sharing of information, it is not. That is why Org
> development strive to provide more and more structure, something I
> said, they try to make it like a database, but because there is no
> structure, it becomes the never ending story of milions of bugs.


I agree with you, although I don't know if the goal of the org-mode
developers is to do this.



> In my work I use meta level. First I am liberated from Org mode, or
> any kind of mode. And I like flexibility to mix various markups. I can
> use universal hyperlinks that convert themselves into necessary
> markup. I don't like being dependent on some "mode".


> If markup is Org, hyperlink will become Org hyperlink, if markup is
> Markdown, hyperlink will become Markdown link, if it is text, it will
> be shown in text. Why do I need to record 3 versions of same document,
> better one, which can be just represented in different way.


After that, it's the same for org-mode, it can export in a lot of formats,
so in the end you're just adding an extra layer of abstraction to export to
org-mode.

But I see the idea of not depending on org-mode anymore

Maybe you wish to say how artificial intelligence could replace many
> systems. Though personally I do not see how present state of AI would
> know what I need. I can definitely think that my program could get
> some functions "to see the patterns" and then help me create let us
> say new sets. And program without artificial intelligence can tell me
> who has got birthday today, or tomorrow, to help with relationships,
> or it can tell which person received information X, so that person can
> be called to be given information Y, moving person from one stage to
> other. Those simple serial intelligent detection and reminders may be
> programmed.


Yes it can be done through programming, and I agree that relying solely on
artificial intelligence is definitely not a good idea.

On the other hand, I know that AI is excellent at taking data and analyzing
it for you. I've given an ics file (calendar) to chatGPT, and I can ask it
almost any question about this schedule: it will understand. All this,
without a line of code from me.
Yes, today, no artificial intelligence will be able to replace your
application entirely. The problem is that we don't realise how advanced
these areas are. I'm in my third year of computer science, and chatGPT is
able to do my first two years of classes. I'm already at a loss, and I'm
not even in the job market, and I know it. The only thing I have is my
reasoning, which I hope AI is not capable of. You can't pretend that your
system, or mine of course, won't be revolutionised by the presence of a new
AI capable of doing almost everything you've planned, and perhaps without
writing an extra line of code on your part to add a new feature.  And this
is frustrating, but that's the way it is.

I don't want to defend AI, I just maybe want to hold you accountable to
learn about these areas and the main advances so that you don't do
something obsolete as soon as it comes out, but rather use these tools to
improve your goal.


I can't assimilate to those approaches. I have tried and used Org
> successfully until the point of realization that it does not scale
> well. My needs are different.
>

I read the text before this, I have no special remarks to make. You seem to
have thought a lot, and I think I grasped the main ideas. I like the idea
of the markup table.

I have also read the rest of the text, but unfortunately I don't have time
to express everything on a keyboard, and my thoughts may not be the best.
I understand your ideas and your goals. Thank you for discussing with me to
1) help me and 2) share your point of view :)
Don't hesitate to contact me if you want to do a demo on an interested user
or if you need to test things. I would be delighted and honored.

Le jeu. 16 févr. 2023 à 22:39, Jean Louis <bugs@gnu.support> a écrit :

> * Clément Payard <clement020302@gmail.com> [2023-02-16 13:16]:
> >  First of all, thank you for your answer.
> >
> > Sorry, I am not a researcher :(. I'm just a modest student with a passion
> > for emacs, org-mode and PKM environment. So I'm not a big thing ^^. But I
> > think I have a working brain and good ideas... so here I am.
> > The perfect system as I described it does not exist. I've been "looking"
> > for... 6 or 7 months ? Whatever, I think I'll get to the end of this
> > search.
>
> I was referring to researcher in the definition of what you do,
> investigating, researching about note taking. Now I realize that the
> word is used almost exclusively for scientists.
>
> > But, before talking about anything, I would like to know several
> > things:
>
> > - I've heard of Hyperscope before your previous message. I mean, I've
> looked
> > at some of your posts and (I think) videos... but I still don't
> understand
> > where to find it. Can't use it / test it. I think this is on purpose, you
> > didn't finish it.
>
> Yes, I have that problem that database tables are really very dynamic
> and not well polished to just give them to people. And software is
> also not polished, it has some hard coding that I have to modify.
>
> Yes, I am very slow in providing public package for RCD Notes &
> Hyperscope for GNU Emacs.
>
> But I am very willing to help you install it and try it all out and
> make it workable on your computer, in one on one chat or by e-mail,
> that will work well.
>
> I strongly suggest reading and understanding this system:
>
> GeDaFe - PostgreSQL Generic Database Interface:
> http://gedafe.github.io/doc/gedafe-sql.en.html
>
> As the database is based on that design. Design of program basically
> says:
>
> - design the database table by GeDaFe schema
>
> - let system provide functions like add, modify, delete, duplicate
>   automatically
>
> > I only found this:
> > https://hyperscope.link/3/7/1/5/5/RCD-Notes-for-Emacs-37155.html ,
> > which gives a link to get "rcd-cf", which works at my place (after
> > installing the "emacs-libpq" dependency). I just don't know how to
> > use it... Is there a tutorial I can do somewhere? Explanations
> > somewhere?
>
> Ehm. I am not Drew Adams to have it all ready since decades.
>
> I am working from time to time on documentation and want to make it
> exteremely easy to install it.
>
> One part of it I almost ported to SQLite for people management, but
> have to polish functions. It just starts working with the Emacs SQLite
> built-in.
>
> So I need to set it up that for user it "just works" for PostgreSQL.
>
> > - Second thing, your system seems extremely flexible and adaptable
>
> Which is good. It is based on GeDaFe, which means, user is able to add
> any table, and continue managing information by using same system.
>
> > but it also seems terribly rigid.
>
> That may be opinion.
>
> What is rigid are only relationships, I can say what is rigid:
>
> - column timestamp are rigid, they will accept only specific time
>   stamps, and will be automatically generated mostly
>
> - referenced columns are rigid, I can relate note only to person which
>   exist in the database. I cannot relate it to person that does not
>   have an entry in the database. If I wish to do so, than I would
>   write it in the text of the entry. But cannot relate it in the
>   database.
>
> - column types are rigid, for example ID is integer, I cannot write it
>   as text, UUID must be UUID and must conform to the format, I cannot
>   write integer for UUID.
>
> Apart from those rigid principles, nothing else is rigid that I know,
> at least by feeling, without knowing exactly what you mean.
>
> > I don't know what your goal is exactly, but my goal is to make a
> > system that is easy to use, where the information doesn't have to be
> > arranged perfectly.
>
> Goals are defined in features:
>
> RCD Notes & Hyperscope for GNU Emacs, The Dynamic Knowledge Repository:
> https://gnu.support/gnu-emacs/rcd-notes-for-gnu-emacs/index.html
>
> Some of main goals are sales, or helping people, or moving people from
> one stage to other stage.
>
> Imagine some sales flow like:
>
> 10, Client has received the offer online
>
> 20, Client engages in conversation and resolves all questions and doubts
>
> 30, Client arranges the meeting
> 40, The agreement proposal is sent to client
>
> 50, Client may propose modifications to the agreement
>
> 60, Client signs up the agreement and pays
> 70, Service delivered
>
> Then person is moved from one stage to other by using communication
> and documents.
>
> Similar "flows" can be applied with patients in a hospital, or orphan
> child in Tanzania, or development of a school in Uganda.
>
> This system overall is used for planning in order to reach goals and
> purposes. We manage resources, inventory, their locations, geographic
> locations of resources, maps, people, their locations, their
> expenditure, reports, plans, programs, projects, tasks, all with
> purposes of delivering valuable final product.
>
> However, system can be used to play Blues Brothers or Red Hot Chilli
> Peppers. It may be used to quickly find some relevant information and
> help others find references, such as from Gutenberg, or knowledge
> libraries.
>
> It may be used as communication center, call center, Customer
> Relationship Management.
>
> Too many things to even describe at once.
>
> > The problem is that if I don't set up "templates", things always in
> > the same place, with always the same structure, I won't be able to
> > have queryable information (because how find the information if it's
> > not the same format/place ?).
>
> I think with "templates" you refer to structure of database table. You
> may try using function M-x cf-sql-table as it is Emacs skeleton to
> help with database table creation.
>
> Within seconds I create this below:
>
> -- ------------------------------------------
> -- ------------ Table notes
> -- ------------------------------------------
> DROP SEQUENCE notes_id_seq;
>
> CREATE TABLE notes (
> notes_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
> notes_uuid UUID NOT NULL DEFAULT gen_random_uuid(),
> notes_datecreated TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT
> NULL,
> notes_datemodified TIMESTAMP WITH TIME ZONE,
> notes_usercreated TEXT NOT NULL DEFAULT current_user,
> notes_usermodified TEXT NOT NULL DEFAULT current_user,
> notes_name TEXT NOT NULL,
> notes_description TEXT
> );
>
> GRANT ALL ON notes TO PUBLIC;
>
> DROP VIEW notes_combo;
> CREATE OR REPLACE VIEW notes_combo AS
> SELECT notes_id AS id,
> notes_name AS TEXT
> FROM notes;
>
> GRANT SELECT ON notes_combo TO PUBLIC;
>
> COMMENT ON TABLE notes IS 'Notes';
>
> COMMENT ON COLUMN notes.notes_id IS 'ID';
> COMMENT ON COLUMN notes.notes_uuid IS 'UUID';
> COMMENT ON COLUMN notes.notes_datecreated IS 'Date created';
> COMMENT ON COLUMN notes.notes_datemodified IS 'Date modified';
> COMMENT ON COLUMN notes.notes_usercreated IS 'User created';
> COMMENT ON COLUMN notes.notes_usermodified IS 'User modified';
> COMMENT ON COLUMN notes.notes_name IS 'Name';
> COMMENT ON COLUMN notes.notes_description IS 'Description';
>
> -- CREATE UNIQUE INDEX notes_index ON notes ( notes_name );
>
> -- INSERT INTO notes (notes_name) VALUES ('');
> -- INSERT INTO meta_tables VALUES ('notes', 'hide', '1');
>
> -- Triggers
> -- For Date Modified
> CREATE TRIGGER notes_moddatetime
> BEFORE UPDATE ON notes
> FOR EACH ROW
> EXECUTE PROCEDURE moddatetime(notes_datemodified);
>
> -- For User Modified
> CREATE TRIGGER insert_username_notes
> BEFORE INSERT OR UPDATE ON notes
> FOR EACH ROW
> EXECUTE PROCEDURE insert_username(notes_usermodified);
>
> So the above is "template" in the database, it defines which types of
> entries are there. "Notes name" is always string, cannot be number,
> but it can be string having number.
>
> That is simple example.
>
> In my workflow, when developing new database table I do this:
>
> (rcd-db-create-table "newtable" MY-HANDLE)
>
> Then I start adding some items, then if I feel I need new column, I do
> that interactively in Emacs.
>
> I think everything should be interactive and easily integrated for
> user, I am working on it.
>
> It should be M-x rcd-db-create-table interactively, and not only as
> function.
>
> > So I decided that only certain information would be queryable,
> > information that I judge to be useful.
>
> Everything may be queried. With PostgreSQL you may add column for
> "tokens", and then get full text search, which means, you could push
> all of the column values into those tokens, and have PostgreSQL handle
> queries for you. This is very useful feature.
>
> Hyperscope full text search with PostgreSQL:
>
> https://hyperscope.link/3/6/7/6/8/Hyperscope-full-text-search-with-PostgreSQL-36768.html
>
> PostgreSQL: Documentation: 15: Chapter 12. Full Text Search:
> https://www.postgresql.org/docs/15/textsearch.html
>
> Currently I have 64+ ways of searching for information.
>
> My experience tells me you should develop in structured way.
>
> Do not use "First name, last name", but use:
>
> - "First name"
> - "Middle name"
> - "Last name"
>
> as 3 fields. Same principle shall apply for other information. If you
> have "Date, note name" as mixed string, better separate "Date" from
> "Note name".
>
> Structure and add properties.
>
> After a while you may do intersections and query by means possible
> ways. It becomes Dynamic Knowledge Repository, when system become
> capable to represent the needed knowledge for human and help human
> move in processes of life.
>
> > A new piece of information that I don't need to be queryable, but
> > just need to be found, will therefore be very easy to store.
>
> For me I can query anything, I can find anything. I do not know what
> you mean with "to query" versus "to find".
>
> > The problem and the great weakness of such a system is that I have
> > to define the queryable information in advance.
>
> No, you need not think of that. Do you use database?
>
> I am not thinking in advance about "queryable" information. I am
> thinking of structure, or types, and do not worry of future. All
> types, columns, anything is automatically capable to be queried.
>
> Here is example of addresses structure:
>
>                                                    Table "public.addresses"
>
> ┌─────────────────────────┬──────────────────────────┬───────────┬──────────┬─────────────────────────────────────────────────┐
> │         Column          │           Type           │ Collation │
> Nullable │                     Default                     │
>
> ├─────────────────────────┼──────────────────────────┼───────────┼──────────┼─────────────────────────────────────────────────┤
> │ addresses_id            │ integer                  │           │ not
> null │ nextval('addresses_addresses_id_seq'::regclass) │
> │ addresses_datecreated   │ timestamp with time zone │           │ not
> null │ CURRENT_TIMESTAMP                               │
> │ addresses_datemodified  │ timestamp with time zone │           │
>   │                                                 │
> │ addresses_usercreated   │ text                     │           │ not
> null │ CURRENT_USER                                    │
> │ addresses_usermodified  │ text                     │           │ not
> null │ CURRENT_USER                                    │
> │ addresses_people        │ integer                  │           │
>   │                                                 │
> │ addresses_addresstypes  │ integer                  │           │ not
> null │ 1                                               │
> │ addresses_name          │ text                     │           │ not
> null │ 'Address'::text                                 │
> │ addresses_line1         │ text                     │           │
>   │                                                 │
> │ addresses_line2         │ text                     │           │
>   │                                                 │
> │ addresses_line3         │ text                     │           │
>   │                                                 │
> │ addresses_city          │ text                     │           │
>   │                                                 │
> │ addresses_region        │ text                     │           │
>   │                                                 │
> │ addresses_postcode      │ text                     │           │
>   │                                                 │
> │ addresses_countries     │ integer                  │           │
>   │                                                 │
> │ addresses_datevalidated │ timestamp with time zone │           │
>   │                                                 │
> │ addresses_locations     │ integer                  │           │
>   │                                                 │
> │ addresses_description   │ text                     │           │
>   │                                                 │
> │ addresses_inactive      │ boolean                  │           │
>   │                                                 │
> │ addresses_default       │ boolean                  │           │
>   │                                                 │
> │ addresses_uuid          │ uuid                     │           │ not
> null │ gen_random_uuid()                               │
>
> └─────────────────────────┴──────────────────────────┴───────────┴──────────┴─────────────────────────────────────────────────┘
> Indexes:
>     "addresses_pkey" PRIMARY KEY, btree (addresses_id)
>     "addresses_addresses_uuid_key" UNIQUE CONSTRAINT, btree
> (addresses_uuid)
> Foreign-key constraints:
>     "addresses_addresses_addresstypes_fkey" FOREIGN KEY
> (addresses_addresstypes) REFERENCES addresstypes(addresstypes_id)
>     "addresses_addresses_countries_fkey" FOREIGN KEY (addresses_countries)
> REFERENCES countries(countries_id)
>     "addresses_addresses_locations_fkey" FOREIGN KEY (addresses_locations)
> REFERENCES locations(locations_id)
>     "addresses_addresses_people_fkey" FOREIGN KEY (addresses_people)
> REFERENCES people(people_id)
> Referenced by:
>     TABLE "commlines" CONSTRAINT "commlines_commlines_addresses_fkey"
> FOREIGN KEY (commlines_addresses) REFERENCES addresses(addresses_id)
> Triggers:
>     addresses_moddatetime BEFORE UPDATE ON addresses FOR EACH ROW EXECUTE
> FUNCTION moddatetime('addresses_datemodified')
>     insert_username_addresses BEFORE INSERT OR UPDATE ON addresses FOR
> EACH ROW EXECUTE FUNCTION insert_username('addresses_usermodified')
>
> And here is list of address types:
>
>  1          Default address
>  2          Billing Address
>  3          Shipping Address
>  4          Registered Address
>  5          Work address
>  6          Mailing address
>  7          Post Box Address
>  8          Origin addresss
>
> Because of the design of tables, and conditional correct entries into
> the database, it becomes very easy to find for example "POST BOX"
> address of all people in Mwanza city.
>
> But if I would not define address types, I would have more serious
> problem to find those post box addresses.
>
> > Whereas you may have the opposite problem: every piece of
> > information is queryable, but a new piece of information takes a
> > long time to put away.
>
> I do not understand "put away", is it to "remove it"? I do not
> understand the problem.
>
> > You can't just put information down like that (maybe I am wrong,
> > maybe you can. But from what I understand, no). And that's the
> > dilemma: either you make something extremely rigid, but "queryable",
> > i.e. you can query the system itself with requests.
>
> Making database based structure of objects is to many degrees way more
> beneficial than having it without structure.
>
> > Or we do something extremely flexible, exactly like a big org-mode
> > file where we just put the information, and the user can use his
> > method (grep for example).
>
> For single user that may be fine. For collaborative work, multi-user
> access is not, or sharing of information, it is not. That is why Org
> development strive to provide more and more structure, something I
> said, they try to make it like a database, but because there is no
> structure, it becomes the never ending story of milions of bugs.
>
> > For me, the perfection was between the> two, exactly what org-roam
> > offers: org-mode + database in the background for some operations.
>
> I wish I could try org-roam, but I get error, so I follow instructions
> and cannot install it.
>
> In my work I use meta level. First I am liberated from Org mode, or
> any kind of mode. And I like flexibility to mix various markups. I can
> use universal hyperlinks that convert themselves into necessary
> markup. I don't like being dependent on some "mode".
>
> If markup is Org, hyperlink will become Org hyperlink, if markup is
> Markdown, hyperlink will become Markdown link, if it is text, it will
> be shown in text. Why do I need to record 3 versions of same document,
> better one, which can be just represented in different way.
>
> > All this to get to the next thing: AI. I can give my notes, which
> > are very flexible, to ChatGPT, and ask it complex questions about
> > the notes
>
> I would never give my information to outside companies I do not
> know.
>
> I understand you. Though I do not see personal use of it.
>
> > So, my big question: aren't our respective (mine with org-roam +
> > org-roam + metadata, and yours with Hyperscope) systems already
> > obsolete?
>
> Maybe you wish to say how artificial intelligence could replace many
> systems. Though personally I do not see how present state of AI would
> know what I need. I can definitely think that my program could get
> some functions "to see the patterns" and then help me create let us
> say new sets. And program without artificial intelligence can tell me
> who has got birthday today, or tomorrow, to help with relationships,
> or it can tell which person received information X, so that person can
> be called to be given information Y, moving person from one stage to
> other. Those simple serial intelligent detection and reminders may be
> programmed.
>
> > Is it useful to make such a complex system when maybe in 2 years
> > time an open source AI will be able to understand 95% of the
> > questions asked?
>
> Maybe, however, you compared things which are not comparable.
>
> > I've chosen my side: I'll wait for the release of an AI, and I
> > remain flexible, without breaking my head to make the ideal
> > database, with the ideal links and the ideal notes.
>
> There is no ideal.
>
> In fact, my side everything started with GeDaFe and function
> M-x cf-sql-table and it is very dynamic, changeable, over time it get
> better and better, more useful, perfected.
>
> Once system is there so automatically provide interface for ANY kind
> of database tables, then person can practically do anything with
> it. On each entry make some function you need, and upgrade with
> time. It becomes personal extension, cyborg like.
>
> > On the other hand, I am capable of listening to you and changing my
> > mind if you think that your method, rigid and based on databases, is
> > viable and brings a plus in the long term despite the arrival of the
> > AI.
>
> I can't tell what it brings to you, as I said, it is very personal,
> though it does go towards common found purposes, such as Customer
> Relationship Management.
>
> > - Finally, I need some clarifications on some points, but maybe I just
> > misunderstood:
> >   - you put "types" and "subtypes"... why? To take your example with
> Music
> > and Country, why not define, in the "node" / heading / Hyperdocument the
> > term "Country", and say that it is a subclass of music? (with a
> particular
> > type of link for example). A bit like wikidata.
>
> I understand you, and that is quite possible. Though not same.
>
> Purpose of types is to understand type of object, subtype describes
> purpose of the object.
>
> If type is spreadsheet, subtype may say it is "Financial Plan".
>
> On my side, the type:
>
> - can have embedded Emacs Lisp, it means, user can say how is this
>   type handled, activated,
>
> - it can have different available Emacs mode, that is property of type
>
> - it may have multiple minor modes
>
> - designation if it is file, or database object for computer to know
>   how to handle it
>
> - template
>
> - 3 tags that are automatically assigned to all of those objects of
>   that type
>
> - priority
>
> - embedded key for dynamic keymap (not programmed, but user defined)
>
> - "Activity" signal, as what is active is similar to task, meeting,
>   something "TO DO", what is not active is not considered for actions
>
> - foreground, background color, fancy name for presentations
>
> - next activity type, because some things like task, can be followed
>   up with "follow-up" type, or similar
>
> and unlimited other properties that I can add over time. Those
> properties of the type I cannot add in a single string where I am to
> write two words, similar like categories. And writing of a name by
> hand is not my choice, I choose types much quicker.
>
> Subtype of document is something like stronger tag, but not floating
> tag, it is more rigid. For example "Document, Loan Request" would give
> quite clear intersection of such documents.
>
> Subtypes also have properties, though are not considered as strong as
> types.
>
> > - what is the differences between ID and UUID in your system ?
>
> ID is local to the database, while UUID is general. By using UUID, it
> is possible to export the object, without ID, and import to other
> database, creating there maybe different ID, however, because of the
> UUID, both parties would know we are dealing with same person Joe Doe,
> or referring to same object.
>
> ID is used as primary key and it is easier to sort items by integer
> then by UUID.
>
> And UUID I use as universal hyperlink, very handy.
>
> Think of Org, instead of:
>
> #+BEGIN_SRC my-program
> (defun hyperscope-list-tokens-not-updated ()
>   "List Hyperdocuments without full text searcch tokens."
>   (interactive)
>   (let* ((sql "SELECT hyobjects_id FROM hyobjects WHERE hyobjects_tokens
> IS NULL ORDER BY hyobjects_rank DESC")
>          (id-list (rcd-sql sql hs-db)))
>     (hyperscope-by-id-list id-list "No hyperdocuments found without
> updated tokens.")))
> #+END_SRC
>
> I could use this:
>
> ⟦ (uuid "dccbe9ff-9c5f-4b02-919e-0849cf272707") ⟧
>
> and by clicking on the above UUID I would find me in different object,
> editing that above function. It would interpolate it's result in the
> source object.
>
> Or I could do this:
>
> #+BEGIN_SRC my-program
> (uuid-link "dccbe9ff-9c5f-4b02-919e-0849cf272707")
> #+END_SRC
>
> and similarly, by clicking on the above UUID, I would find me in
> different environment, edit Babel program and come back.
>
> Or I can use universal hyperlink, like
>
> hyperscope:d7c8d51f-ffaa-4ffc-bb3e-627d048b4c02 in Org, or HTML, or in
> PDF, which brings me back to Hyperdocument in computer.
>
> This is very practical, we have already many projects printed, or as
> PDF, where user can just click back and forth to task, and back to
> Table of Contents, or just by clicking straight to Emacs to edit the
> people entry, or Hyperdocument entry.
>
> I did not yet make experimental or demonstration of it, but we use it
> in business managing thousands of dollars and people on different
> parts of country and world this way.
>
> >   - your links have uuid, it's an "own entity", an "Elementary Objects".
> I
> > think this is great on paper, really. The problem: Doesn't it become too
> > complicated to manage the types of links and all the relation possible
> > between two Hyperdocument ?
>
> What is complicated is writing documentation about it.
>
> It is not complicated managing relations between hyperdocuments or
> people.
>
> - "c c" is for "duplicate" Hyperdocument, new document get
>   automatically CHILD relationship to PARENT
>
> - there is function to relate selected (with cursor) Hyperdocument to
>   other Hyperdocument, by using completion
>
> - there is function to relate visible Hyperdocuments in a list to each
>   other
>
> - there are functions to relate people to Hyperdocuments
>
> I understand that it can all sound difficult, but practically, I can
> teach new person in 10 minutes the work, and person will
> perform. There is nothing special to it. It is very integrated now.
>
> When I look in the database, I have 8771 not-unique people related to
> Hyperdocuments, that many relationships are inside. But does it
> matter? The number sounds overwhelming and it does not matter!
>
> What matters is the specific, not general information.
>
> - I get idea that I have to inform client about basic principles of
>   business XYZ, and it is associated with word "establishment" by
>   using "C-c h n"
>
> - I write "establish" RET and get 32 results
>
> - The most referenced Hyperdocument is WWW hyperlink, and it is on
>   first place
>
> - I find the set on 2nd place, arrow down and right or "j" and "l" and
>   I enter in the set (key binding similar to Vi)
>
> - I find document I want to share to client
>
> - but did I share it already? I do not remember, so I press keys "s r"
>   to see relationships to people.
>
> - I see that his name is not in list of people who got the document,
>   and I share it to client with "h s" and choosing client's name
>
> - Document is now automatically related to that person with relation
>   "INFORMED BY EMAIL" and relation type can be anything
>
> It is matter of habit. Just like all other keys in Emacs, one get the
> habit and it works well.
>
> >   - I have absolutely no idea what Hyperscope, rcd and org-mode have to
> do
> > with it. I'm trying to understand, watching your video... but nothing. I
> > understand only the general idea.
>
> I can totally understand you. I am well aware that it is so. Even if
> documentation would be there, I would understand.
>
> Let us say I have a technical hobby and 15000 PDF references to
> various technical articles, nicely indexed. In this case system is
> used for learning, without reading or wasting time on pages which are
> not essential. Only what is essential can be quickly selected or
> referenced, or new lists of PDF or WWW presentations formed out of
> it. Project assignments can be formed out of it.
>
> Maybe I wish to find quicker books in Gutenberg library, so I do that
> function.
>
> Maybe there are teams of people, I assign them tasks, but then system
> generates automatically the project structure with all tasks inside,
> so the PDF document can be printed and be given to all people in
> transparent way, to know which person is assigned to what task.
>
> What does Org mode has with it? Nothing fixed. I can write anything in
> Org mode, or in other markup, it is multi markup system, I can mix
> markups, as objects are separated, they are not in one file. Write
> task in simple text, OK, it will be embedded, but maybe not so nice
> looking as written in Org or LaTeX. It is something that user may
> define, it is a table of markups.
>
>  1          Text to text
>  2          Text to HTML (body only)
>  3          Text to PDF
>  4          Text to text with lines joined
>  5          Discount Markdown to HTML
>  6          Discount Markdown to text
>  7          txt2tags to HTML
>  8          Org to HTML
>  9          Markdown (Discount Markdown) to Asciidoc
>  10         Markdown (Discount) with Table of Content to PDF
>  11         Text to LaTeX
>  12         Markdown (Discount) with Table of Content to HTML
>  13         txt2tags to LaTeX
>  14         Text to HTML (with full page and template)
>  15         Asciidoctor to HTML
>  16         Wikitext to HTML
>  17         Asciidoc to HTML
>  18         Asciidoc to LaTeX (body only)
>  19         Org to LaTeX (body only)
>  20         Djot to HTML
>  21         Asciidoctor to Text
>  22         LaTeX to PDF
>  23         Org to PDF
>  24         Text to HTML (preformatted)
>
> You can then imagine that objects can have different markups, or none,
> plain text, and they can be converted to some other main markup.
>
> > To take the example of org-roam, we have: org-mode which is
> > plain-text.
>
> For me it is not "plain text" no matter how someone call it. It is
> structured, and cannot be used actively without being
> structured.
>
> It has deceptive motto that it is "plain text". Then I could say for
> XML that it is also "plain text", well that is not quite so. It must
> have expected structure to be Org text.
>
> Plain text has no relation to a program, it is plain.
>
> > org-roam allows to store in a database some information present in
> org-mode,
> > like the title, the links etc. Then, when searching, we rely on this
> > information and this database. But the useful information itself is often
> > underneath this database layer: these are the org-mode files.
>
> I can't assimilate to those approaches. I have tried and used Org
> successfully until the point of realization that it does not scale
> well. My needs are different.
>
> Number of my Maildirs is 59934. That is number of people I have
> communicated to or number of conversations. The program "mu4e" can't
> handle that, it does not work, it gets stuck forever, author admitted
> it can't. There is 240676 people in the database. I cannot handle that
> with any other software, and they are tied to marketing efforts. 53131
> Hyperdocuments are there.
>
> GeDaFe taught me to go with easy approach, and so I use the principles
> of GeDaFe for long time. Create database table as I wish, manage it
> automatically.
>
> > I was going to launch into a paragraph of theory but I don't think
> > that's useful: it will be wrong and will waste writing time for me
> > and reading time for you. Anyway: what is the link between your
> > differents "layers", that is : Hyperscope, rcd, databases, org-mode,
> > etc ? Who does what, and how?
>
> They may be layers for you, I do not see it as such. Database is for
> ordered storage, I do not think of it. Org mode is just one of
> multiple markups which I can use, I can use any markup. Major point is
> communication with people that is why all those Hyperdocuments are
> there and people management.
>
> I can give practical example:
>
> - local chairman is found on ground
>
> - we greet chairman, and collect full contact information (CRM +
> Hyperscope)
>
> - we find his house, and record GPS position (not all countries have
>   street numbers) (geographic locations table)
>
> - team member quit and goes to other company
>
> - new team member is assigned
>
> - chairman and all actors in the village are exported and given as
>   information to team member
>
> - team member knows background of the chairman, could be mean person,
>   or get information how to handle him
>
> In that practical example knowledge is used to smooth the future
> processes of the business.
>
> Design is described here:
>
> TECHNOLOGY TEMPLATE PROJECT OHS Framework :
> https://www.dougengelbart.org/content/view/110/460/
>
> Reasons or purposes are described here:
>
> About Dynamic Knowledge Repositories (DKR):
> https://www.dougengelbart.org/content/view/190/163/
>
> The CODIAK Process Cluster: Best Strategic Application Candidate6:
> https://www.dougengelbart.org/content/view/116/#6
>
> ,----
> | The concurrent development, integration and application of knowledge.
> `----
>
> ,----
> | Intelligence Collection: An alert project group, whether classified as
> | an A, B, or C Activity, always keeps a watchful eye on its external
> | environment, actively surveying, ingesting, and interacting with
> | it. The resulting intelligence is integrated with other project
> | knowledge on an ongoing basis to identify problems, needs, and
> | opportunities which might require attention or action. 6g1
> `----
>
> ,----
> | Dialog Records: Responding effectively to needs and opportunities
> | involves a high degree of coordination and dialog within and across
> | project groups. This dialog, along with resulting decisions, is
> | integrated with other project knowledge on a continuing basis.
> `----
>
> ,----
> | Knowledge Product: The resulting plans provide a comprehensive picture
> | of the project at hand, including proposals, specifications,
> | descriptions, work breakdown structures, milestones, time lines,
> | staffing, facility requirements, budgets, and so on. These documents,
> | which are iteratively and collaboratively developed, represent the
> | knowledge products of the project team, and constitute both the
> | current project status and a roadmap for implementation and
> | deployment. The CODIAK process is rarely a one-shot effort. Lessons
> | learned, as well as intelligence and dialog, must be constantly
> | analyzed, digested, and integrated into the knowledge products
> | throughout the life cycle of the project
> `----
>
> That description is accurate, that is exactly what is taking place. It
> is evolving, dynamical knowledge, that results with the purposes.
>
> ,----
> | The Community's basic knowledge products could be viewed as dynamic
> | electronic handbooks on "how to be better at your improvement tasks,"
> | with two customer groups: its B-Activity customers; and the C
> | Community itself. Pooling resources from the member organizations
> | enables a more advanced and rapidly evolving prototype CODIAK
> | environment, which serves two very important purposes:
> |
> | 1. It provides for the Community getting better and better at its
> | basic "C Activity;"
> |
> | 2. It provides advanced experience for its rotating staff of
> | participants from the member organizations. They thus develop real
> | understanding about the real issues involved in boosting CODIAK
> | capability - this understanding being absorbed by "living out there in
> | a real, hard-working CODIAK frontier."
> `----
>
> By looking into principles of Doug Engelbart, I can see how it has to
> be developed.
>
> And I am not doing it for sake of development per se.
>
> I must do it for sake of getting things done.
>
> My "things" involve handling complex relationships with people,
> meetings, understanding people's goals, purposes, policies, complying
> to their viewpoints (it involves good dose of pretending), solving
> issues, and making agreements.
>
> I can track it on paper, but I get some problems with it, so that is
> why we track in the database, and move people and processes from one
> stage to other stage towards goals and purposes.
>
> --
> Jean
>
> Take action in Free Software Foundation campaigns:
> https://www.fsf.org/campaigns
>
> In support of Richard M. Stallman
> https://stallmansupport.org/
>

[-- Attachment #2: Type: text/html, Size: 53222 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Link type in org-mode, but with org-roam ?
  2023-02-21 16:17   ` Cletip Cletip
@ 2023-02-22 19:30     ` Jean Louis
  0 siblings, 0 replies; 6+ messages in thread
From: Jean Louis @ 2023-02-22 19:30 UTC (permalink / raw)
  To: Cletip Cletip; +Cc: Org Mode List

* Cletip Cletip <clement020302@gmail.com> [2023-02-21 19:20]:
> I am not thinking in advance about "queryable" information. I am
> > thinking of structure, or types, and do not worry of future. All
> > types, columns, anything is automatically capable to be queried.

Solely the above paragraph is not giving me enough information. It is
general statement. In every Emacs buffer anything is automatically
capable to be queried. One can search by using regular expressions and
there is plethora of other ways to find information. Similarly one can
tell that for many other systems. I find almost anything in any text
by using `ed' the standard text editor.

I am trying to understand what you mean with it, and it that is
something that I have not described above.

> I was talking about my system which was made with org-roam, so the
> information stored in the notes is in plain text. But, to make them
> queryable, I have to add "metadata" as said before with key-value.

Okay, I understand. Meta data is normally not visible or can be made
visible, but is not part of the text, but could be part of Org
heading, like Org properties or tags. Including that all words and
sentence can also be considered part of it.

> So I'm using a database, but I don't want to bother thinking about
> how I can add new information to my system. You, you need to think
> about "what describes this information?" 

I cannot see practical example, so I cannot understand.

I cannot even know if your description of what I think fits to what I
think that I think... hmm, let me see. Do I really think about "What
describes this information"? 

When I enter document in the Dynamic Knowledge Repository, then I name
it. In that sense I think of "what describes this information", as I
have to describe it, sort it, under some set, which is another way of
describing it, maybe relate to people, and so on.

However, when you write any text, you are "describing this
information". I am trying to understand what you mean and how do you
mean of doing things "without describing information".

> If it's someone, you create a new table (not sure if this is this
> term to use) to hold that knowledge.  I don't want to think about
> that, I just want to put the information in and find it without
> thinking about tables.

Yes, database system like GeDaFe is designed for user to create new
table. Though that is not happening too often. 

If you only work with text, you need not special database, as your
file system is enough. 

Org is prime example how text may be structured and mimic database
features.

> > Because of the design of tables, and conditional correct entries into
> > the database, it becomes very easy to find for example "POST BOX"
> > address of all people in Mwanza city.
> 
> Here, everything is queryable, because you have already thought of
> all the possible cases that could happen. In my system, I decided to
> do the opposite: why think of a particular case if I'm not even sure
> I'm doing it?

It is true that by thinking in advance, one can get better results.

For example, one starts creating separate table columns for:

- first name
- middle names
- last name

then I realized, people have nick names, what else, so I added another
column like:

- other names, as array that can hold any number of names

then people have their titles, so you add "title" column.

But then I realize people have different relationships, may have
different roles in different organizations and thus different titles,
so I added "people relationship" table, in which "titles" are
described individually. 

And then how to search for that information? PostgreSQL full text
search does that. 

Mastering PostgreSQL Tools: Full-Text Search and Phrase Search - Compose Articles:
https://compose.com/articles/mastering-postgresql-tools-full-text-search-and-phrase-search/

So then anything may be queried with simple search, as long as all
those fields are updated for full text search:

Possible queries could be:

- baker in Monaco
- Joe, baker
- Joe director Monaco

and so on, and they could lead to same person.

> But our goals are not the same, you have to have a solid system for
> several people, I do something much more personal. So, it's ok.

I will understand when you show me example.

> I wanted to say that adding a new type of information can be time
> consuming: you have to add the table, and above all check that
> another table does not already exist to do the same thing.

That is not time consuming:

- adding new table is maybe 1 minute

- I never check if other table do the same thing, but I could start
  making new table to improve previous work

Adding tables is rapid on my side. 

> So you need excellent documentation, hoping that the system itself
> doesn't become too "cluttered" for the user.

I need documentation, I have little of it. It is just as Org, it needs
a lot of documentation for people to use it.

> For your purpose, yes. For mine, no. I think that every thing that
> has to have a special presentation / type in the database is an
> exception: the user has to think / look that, if he wants to add a
> contact, he has to look for the type "contact".

If I wish to add contact, I click with mouse, or do something like 

C-c p N - for new contact, and enter it. I am asked few questions, and
it is entered.

And same in Org, some information I like to enter by using
templates. I did not like creating empty Org, because I had too many
people to deal with. So when I create a person, I had single click to
create the Org file with the name and personal information of that
person, and tasks, and table for expenses, and final calculation of
cash account. 

In Org we have to look for tags, properties, heading, those are all
types. Using it as really plain text is possible, but not as
beneficial. Types are useful in computing to sort information better. 

> I would like my system to detect by itself that when I give a
> node/heading org-mode as title "A-name A-forname", it understands by
> itself that it is a contact.

For computer, without designation of a type, it will never get that
type of intelligence.

When I am entering new name of person, if I enter ">" before the name,
that means that names is not individual name and computer asks me if
it is company or list of people, or maybe government office, what it
is. But it is not individual.

User must somehow designate for computer that heading is "contact". 

> And if I put a phone number underneath, I can just ask him "give me
> the phone number of X", and he gives it to me correctly.

Good, that is how I think computers should be today. But they are not.

> I repeat because I don't want to offend you: we don't have the same
> goals, so it is normal that our methods are different.

You strive same thing, and I don't understand you, so I can't tell
anything so fast as you can.

> On the other hand, I would very much like to test your method, it
> intrigues and interests me a lot.

Before anything, I have to understand what you wish to achieve. What
is the purpose for which you devise methods?

> > > Or we do something extremely flexible, exactly like a big
> > > org-mode file where we just put the information, and the user
> > > can use his method (grep for example).
> 
> For single user that may be fine. For collaborative work, multi-user
> > access is not, or sharing of information, it is not. That is why Org
> > development strive to provide more and more structure, something I
> > said, they try to make it like a database, but because there is no
> > structure, it becomes the never ending story of milions of bugs.
> 
> 
> I agree with you, although I don't know if the goal of the org-mode
> developers is to do this.

It is not, as it was made be user who was not thinking of
collaboration, group or team work, sharing with the world. Org is
designed to be very personal. 

Let us say for collaborative editing in Emacs, one could use `crdt'
package together with Org mode, and multiple people can edit it over
network.

> > In my work I use meta level. First I am liberated from Org mode, or
> > any kind of mode. And I like flexibility to mix various markups. I can
> > use universal hyperlinks that convert themselves into necessary
> > markup. I don't like being dependent on some "mode".
> 
> > If markup is Org, hyperlink will become Org hyperlink, if markup is
> > Markdown, hyperlink will become Markdown link, if it is text, it will
> > be shown in text. Why do I need to record 3 versions of same document,
> > better one, which can be just represented in different way.
> 
> After that, it's the same for org-mode, it can export in a lot of formats,
> so in the end you're just adding an extra layer of abstraction to export to
> org-mode.

No, I don't think that tying people to Org mode for sake of Org mode
is good, rather using Org for what it is good. My purpose is not at
all "Org mode" but that human can get educated easier or conduct
tasks, or that we can finalize plans, programs and projects. 

One important task in management is handling cash accounts of people
working for us. Imagine columns like Transaction ID, description, name
of account money comes from, name of account money goes to, debit
amount, credit amount, balance. It may fit, or may not fit in Org, I
get some problems with it. So I used Asciidoctor to generate account
statements. But then I think, I have to use Pango markup and `paps'
command, or LaTeX directly, for reasons that I wish various fields be
shown to user. Org cannot handle LaTeX tables directly well, so I
can't use that markup. I can't see the information by using Org
tables! Asciidoc works really well for that purpose. I am sure that
direct LaTeX can do that without problems as well. So I will use
any method that works and mix it in a mixed object Hyperdocument.

dov/paps: A text to postscript converter through pango:
https://github.com/dov/paps

> Yes, today, no artificial intelligence will be able to replace your
> application entirely. The problem is that we don't realise how advanced
> these areas are. I'm in my third year of computer science, and chatGPT is
> able to do my first two years of classes. I'm already at a loss, and I'm
> not even in the job market, and I know it.

Alright. I hope you are not using ChatGPT to make works that pretend
to be your mind's work, as that could be plagiarism.

In fact, I do not now if your writing is of human or ChatGPT... 

> The only thing I have is my reasoning, which I hope AI is not
> capable of. You can't pretend that your system, or mine of course,
> won't be revolutionised by the presence of a new AI capable of doing
> almost everything you've planned, and perhaps without writing an
> extra line of code on your part to add a new feature.  And this is
> frustrating, but that's the way it is.

I wish it could integrate things. ChatGPT does not work by means of
the real understanding. It works by reconstructing some information,
and relating information to each other. Computer does not understand
information, it just gives to human an illusion that it does. 

> I don't want to defend AI, I just maybe want to hold you accountable
> to learn about these areas and the main advances so that you don't
> do something obsolete as soon as it comes out, but rather use these
> tools to improve your goal.

I have no means to understand you, and to use tools which I do not
have as free software. If it free software, do you hav example.

-- 
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-02-22 20:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-13 16:05 Link type in org-mode, but with org-roam ? Cletip Cletip
2023-02-14 10:41 ` Jean Louis
2023-02-16 12:44 ` Ihor Radchenko
2023-02-16 20:40 ` Jean Louis
2023-02-21 16:17   ` Cletip Cletip
2023-02-22 19:30     ` Jean Louis

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).