Thanks Evgeny, you cannot execute my jupyter notebooks on Azure cloud and I think you have to login first in order to view them. In any case my CacheORM module is dependent on intersys.pythonbind module. One has to install this first and verify that it works then start playing with my demos. I wrote guidelines about installation in Github README file.

Hi Rob, thank you for the update on your QEWD project. One of the main reasons I chose Python as the binding language for Cache in our project instead of Javascript is that in data analysis, data science area the first is already well established, extremely popular and there is big momentum on developing further a vast collection of tools and libraries that extent the language. But the second clearly wins the battle in web platform development. I am sure I will definitely re-visit your project and perhaps ask you to collaborate when I reach the stage of developing the front end and/or another client API. For our readers I must also mention that your article on a universal NoSQL engine using Globals is a must read for anyone that wants to understand the power of multi-dimensional, schema-free, hierarchically structured, sparse, dynamic arrays, i.e. Global Storage databases. And for the history it appeared right at the birth (re-birth) of NoSQL movement back in 2010 ;-)

And  have you noticed that what ever the model and data structure we cannot escape from the fundamental principle of managing data allocation space with references, i.e. pointer based logic, memory addressing ? Isn't this the fundamental mechanism of programming languages too ? The problem I see with all these modern nosql databases, especially graph databases is that they provide a higher level abstraction for the end developer but they hide and lock completely the access to the low level storage and retrieval mechanism including indexes. Even in key-value stores you cannot see or understand the sorting of indexes, you cannot easily reference data values.

Transparency in computer science is a huge issue. Wizards and pioneers of computer hardware and software, have created multiple abstraction layers and here comes the next generation that is asked to program the machine without understanding what is going on underneath. And even if there is such a desire, the environment, the language and the tools, DO NOT help towards this direction. Intersystems cache does make the difference from many aspects. There is a built-in database  with subscripted arrays and multi-dimensional keys similar to the variables used by most programming languages to access main memory.

Let me repeat this, a programming language MUMPS-Cache objectscript with a built-in database. I think this is a fundamental aspect that they have been missing when others invented new programming languages. They are missing the innate common characteristic that both databases and programming languages share which is the pointer, reference based logic. So I believe it's time to return back and fix this for new generation databases AND post-modern programming languages too. What do you think ;-0

Hi Robert,  thank you for sharing with the rest of us this great piece of computer history. They say life is making circles. I believe it's about time for MUMPS to make history again in database management and database modeling with Associative Semiotic Hypergraph engine  build on top of Intersystems Cache globals and a powerful OOP API in Python for data analytics. Stay tuned, I am fond of old pioneers of computer technology and I do respect a lot their efforts and strangle of their time. We build powerful meaningful relationships easily ;-)

Good morning Robert,  based on the piece of code you sent me for a Python TCP socket server I made these SocketReceiver, SocketSender  classes for Python 3 so now it is super easy for anyone to run a simple TCP socket communication test on two Python consoles.

Then I wrote this ClassMethod 

ClassMethod SendMessage(msg As %String = "", port As %Integer)
set tcp="|TCP|"_port
    open tcp:("":port:"PSTE"):1 else  quit
    use tcp
    write msg,!
    write !!
    // close tcp

The only problem here is the 'close tcp' statement that closes the listener which has been set at a Python console and I commented this out  (I am sure there can be a better way). 

Finally I opened two python consoles and successfully tested the whole thing
Case is closed, hope this will be useful for others too, thank you again for your assistance and guidance


Hi Robert, thanks for the update, let's try to sort this out in Cache Terminal then. I have added an extra write !! statement before the close tcp. Then I opened a terminal switched to SAMPLES namespace and entered the following commands

    set person = ##class(Samples.Person).%OpenId(1)

    w person.Name

    do person.PrintPersonTCP()

    set tcp="|TCP|4200"

    open tcp:(:4200):1 write $s($t:"OK",1:"failed"),!

The result is OK

But the next line of your code

     for line=1:1 use tcp read text use 0 write line,?5,text,!

just made the cursor blink in the next line without returning anything

Hi Rubens, the only reason I need this redirection is for sending messages to the Python console for debugging, introspection purposes NOT for sending data. CachePython Query and CachePython Object packages can handle this automatically. Therefore in general I am looking for something simple, like this method Robert wrote above. Alternatively if it's too complicate, I am thinking of opening a stream and write a log there.

Sergey thank you for this series of enlightening articles on Intersystems Cache (MUMPS) globals. I have been influenced too by Rob Tweed and George James article (Globals: A Universal NoSQL Engine). And in my blog post series "Associative Data Modeling Demystified" I am covering a unified view on data models (Relational, Topic Map, RDF, Property Graph, Qlikview) from the associative perspective point of view.

Finally in the last post of my series (Build Powerful, Meaningful, Cohesive Relationships Easily) R3DM/S3DM framework is introduced to the public with a demonstration of a fully functional prototype that is built in OrientDB multi-model DBMS and coded with Wolfram Language. OrientDB multi-model architecture is based on key-value store and this is very close to the globals data structure of Intersystems Cache. But I am a great fun of Intersystems Cache because of the power to manipulate easily indices and data structures and view the results in many alternative forms.

You have touched many interesting topics in you articles. What is most important from my point of view are the alternative representations of tables, documents and graph data structures in a hypergraph uniform space. How you can transform easily from one structure to another, how fast you can insert  new data and how fast you can filter/search. I am positive that Intersystems Cache will do enter graph database arena and self-service BI market and this is where globals will make the difference from other graph technologies especially when they are utilized in our associative, semiotic, hypergraph framework.

I believe we do share a lot in common regarding to cache globals and hope we manage to exchange many ideas in the near future.