Author: Jan Tang

  • DDM Group Terminology

    DDM Group Terminology


    DDM Group Company Google Drive


    bGraph Interface

    While bGraph is referring to the Enterprise Knowledge Management System, the wording “Interface” means how following objects interacts each other to form a bipartite relationships:

    1. How Human interacts (i.e. the touch point) with Human
    2. How Human interacts (i.e. the touch point) with System
    3. How System interacts (i.e. the touch point) with Human
    4. How System interacts (i.e. the touch point) with another System

    DDM Group had classified 7 interfaces layer as below:

    1. Theoretical Model
    2. Frontend GUI
    3. Frontend GUI Visual
    4. Backend GUI
    5. Backend GUI Visual
    6. Backend Source Code Interface
    7. Application Programming Interface

    Theoretical Model

    Theoretical Model is one of the Interface Layers in bGraph. It caters to the interaction between humans and humans. For example, when you want to explain verbally to your friend that  it is a parent-child relationship between the concept Fruit and Apple, the conversation between you and your friend is simply a theoretical model because the parent-child relationship is a relationship which doesn’t have a material substance in reality. 

    Nevertheless, no matter whether the concept has a material substance or not in reality, as long as the concept is not shown within a computer screen, we will classify the concept as Theoretical Model.


    Frontend GUI

    Frontend GUI stands for Frontend Graphical User Interface. It caters to the interaction between humans and systems. 

    Frontend

    The term Frontend is opposite to Backend. While Frontend can be accessed by the general public, Backend will require access authorisation (e.g. login and password).

    GUI (Graphical User Interface)

    Unless you are a I.T person, most of the time the end-user will not realize they are catering with Graphical User Interface (i.e. GUI) every day until they encountered CLI (Command Line Interface.) 

    Almost 40 years ago, when we wanted to create a folder in the computer, instead of using the mouse to right click the window browser, we had to type in the command $user: mkdir <<FolderName>> in a bash environment. We called this environment the Command Line Interface (i.e. CLI) .

    mkdir
    mkdir

    40 years later, thanks to technology innovation , we can simply drag and drop the cursor to create or move the folder or file easily. The Desktop in your computer or mobile phone which allows you to drag and drop any files or folder easily is called GUI (Graphical User Interface). Except you are a programmer , almost any thing you read in the screen is a by default GUI, which makes you even don’t know there is a such a name called “GUI“.

    The main reason why we need to understand what is a Frontend GUI in our bGraph system is because of click path coordination. Imagine what if I want you to click find out the Contact Us Form page in a website and fill in the field of Last Name in the Contact Us Form? 

    You can imagine how many words we have to read/write every time when we create an instruction with a Click Path in plain text. In order to streamline the typesetting of the Click Path, DDM Group had invented an in-house Click Path typesetting convention.

    Whenever you see the label Frontend GUI being tagged in a specific term (or a word), it simply means that these terms should be able to be found in a Frontend GUI of a specific application. 

    Please also bear in mind that while a term (or a word) can be in the Frontend GUI of application A, it can at the same time be the Backend GUI of application B.


    Frontend GUI Visual

    Frontend GUI and Frontend GUI have almost the same meaning, except that Frontend GUI Visual is mainly specific on the visual object (i.e. not a word) which you can see on the screen.

    Please consider the following example:

    BottomNavigationBar
    BottomNavigationBar

    Inside the screen, while you can easily coordinate the Button of Home / Music / Podcasts, what if you want to address the whole “Bottom Navigation Bar”?

    If you literally put the wording “Bottom Navigation Bar” in your Click Path, how can the audience decide whether the wording “Bottom Navigation Bar” can be explicitly found inside the screen, or it is simply a visual object inside the screen?

    To differentiate between the two , we use the term Frontend GUI Visual to address any screen object which does not have an explicitly term or wording shown in the screen. 


    Backend GUI


    Backend GUI Visual


    Backend Source Code Interface


    Application Programming Interface


  • Employe Benefit Equipment of Portable Power Station User Guideline

    Employe Benefit Equipment of Portable Power Station User Guideline

    Please read carefully and understand every single words inside the paragraph before you use the portable power station.


    Disclaimer

    DDM Group shall not be held responsible or liable for any loss, theft, explosion, or damage caused by the portable power station, nor for any third-party liabilities arising from such incidents. Furthermore, DDM Group will not bear the cost of repair or delivery associated with fixing the portable power station. Users are solely responsible for the proper handling, maintenance, and security of the portable power station at all times.


    Portable Power Station Model Number

    The Portable Power Station Model Number will be provided to you together with the Portable Power Station. Make sure you go to its official website and read through the specifications before you bring it to production:

    1. BLUETTI EB3A Portable Power Station | 600W 268Wh

    The consequences of portable power station explosion

    The consequences of a portable power station explosion, such as one with a 600W inverter and 268Wh capacity, depend on several factors, including the battery type, the surrounding environment, and the cause of the explosion. Here’s a general overview:

    1. Magnitude:
    • The explosion of a lithium-ion battery, can release significant energy due to thermal runaway. This process involves rapid overheating, gas release, and potential ignition.
    • The magnitude of the explosion could cause fire, smoke, and debris, potentially damaging nearby objects and structures.
    1. Radius:
    • The immediate blast radius might be limited to a few meters, but the fire and heat generated could spread further, especially in a confined space like a residential apartment.
    • Toxic fumes from burning lithium-ion batteries can also pose health risks to individuals in the vicinity.
    1. Potential Consequences:
    • Property Damage: Nearby furniture, walls, and electronics could be damaged or destroyed.
    • Health Risks: Burns, inhalation of toxic fumes, and injuries from flying debris are possible.
    • Fire Spread: Inflammable materials in the apartment could ignite, leading to a larger fire.

    To mitigate risks, always follow safety guidelines, such as avoiding overcharging, keeping the device away from heat sources, and storing it in a well-ventilated area. If you suspect a battery issue, discontinue use immediately and consult the manufacturer. Let me know if you’d like more safety tips!


    User Guideline for the Portable Power Station

    Reading the user guide for a portable power station is essential to ensure safe, efficient, and effective usage of the device. The guide provides detailed reminders on

    1. Setup
    2. Operation
    3. Maintenance

    This guideline helps you avoid potential hazards like explosions, electrical malfunctions, or improper handling. It also highlights important safety precautions, such as where to place the device and how to charge it correctly to prevent overheating or damage. Byunderstanding the features, limitations, and troubleshooting steps detailed in the guide, you can maximize the lifespan and reliability of the portable power station while minimizing risks and inconveniences. It’s a valuable resource for anyone who wants to use their device confidently and responsibly.


    1. Explosive Risks of the Portable Power Station

    • Heat and Fire Hazards: Avoid exposing the power station to high temperatures, open flames, or prolonged direct sunlight.
    • Electrical Hazards: Never disassemble, modify, or mishandle the power station to prevent electrical risks.
    • Liquid Exposure: Keep the device away from water or other liquids to avoid short circuits or damage.


    2. Checking the Parts and Accessories of the Portable Power Station

    Before usage, inspect all components for completeness and condition:

    Parts

    • Power Station Body: Ensure the device has no visible damage.
    • Power Cord: Verify the cord is intact and operational.
    • Mobile App: Download and install the BLUETTI app for monitoring and smart control.
    • Ports and Interfaces: Ensure the device has all ports and Interfaces that are working properly with no defects.
    • LCD screen:Ensure the LCD screen is not broken and is in good state.

    3. Reminders During Charging

    Power Outage During Charging:

    Whenever there is a power outage during charging you need to the Power station status thus the if you were charging using the AC port it will stop charging,ensure the LCD screen shows that there in no input ,If you have a solar panel you should immediately switch to charging your power station via the solar panel. You can also disconnect non essential devices to preserve power and prioritize essential devices.

    How to Check Charging Status:

    • Monitor the charging progress using the power station’s display screen or the BLUETTI app.
    • Ensure the charging indicator is active to confirm proper operation.

    Any health status checking meter or device

    For advanced health status checking you can use this listed devices

    a). Multimeter (For Voltage & Current Checks)

    • Measures battery voltage (should be ~12.8V when fully charged).
    • Checks solar/car input voltage (should match specs).
    • Tests output consistency (AC/USB ports).

    b). Capacity Testers (For True Battery Health)

    • Devices like ZKETECH EBC-A20 or OPUS BT-C3100 can:
    • Measure actual remaining capacity (vs. rated 268Wh).
    • Detect battery degradation (if capacity drops below 80%).

    C. Infrared Thermometer (For Temperature Checks)

    • Ensures the battery isn’t overheating (>40°C / 104°F is risky).
    • Useful during fast charging or high-load usage.

    Unplug After Full Capacity:

    • Disconnect the power station once it reaches 100% to prevent overcharging or unnecessary wear on the battery.

    Do Not Output During Input:

    • Avoid charging external devices while recharging the power station to ensure safety and maintain charging efficiency.

    4. Usage as a Portable Power Supply

    • Determining Compatible Devices:
    • Check the wattage of your electronic devices and ensure their total consumption does not exceed the 600W output capacity.
    • (Give example on how long it will last if charging a mobile / router , table light and laptop at the same time for a 600W ,268Wh portable power station??)
    • Checking Electricity Flow:
    • Use the display screen or BLUETTI app1 to verify smooth power supply and proper charging.
    • Identifying Abnormal Situations:
    • Look out for error codes, unusual sounds, or overheating during use. Stop usage if such issues occur.
    • (Give Example??)
    • Handling Power Outage During Charging:
    • Charging will automatically resume when the power is restored; ensure the connection remains secure. (Please verify??)
    • Placement Guidelines:
    • Idle: Store the power station in a cool, dry place, away from moisture and direct sunlight. (Please suggest to put into a sealed box??)
    • Recharging: Place it on a stable, ventilated surface to prevent overheating.
    • Charging Other Devices: Ensure a flat and safe surface, away from flammable materials.
    • (When using or charging, put somewhere faraway from any living creature, or find something to hide it ??)

    5. Travel with the Portable Power Station

    • Fully charge the power station before traveling.
    • Use a protective case or cover for transportation to prevent physical damage.
    • Check travel regulations for carrying power stations, especially in air travel (e.g., airline restrictions on battery capacity).

    6. Sharing the Usage of the Portable Power Station

    In case you should share the Portable Power Station to others

    • You are not supposed to travel the Portable Power Station to non-DDM Staff home.
    • If anyone want to share the usage of the Portable Power Station , he/she should only stay in your home.
    • Check the electronic device of the borrower before he/she plug into the portable power station.

    Footnotes

    1. Only if you are using BLUETTI portable power station ↩︎
  • Assign Admin Access Rights of Google Payments Center to Others

    Assign Admin Access Rights of Google Payments Center to Others

    Definition

    Google Payments Center

    Access Rights


    Prerequisite

    Prepare the following materials before you (as an assignor) can assign the access rights to others:

    Decide which Gmail Address to use

    1. Use the same Gmail address which is used to register for the Google Ads account that you are going to link up the Google Payments Center.

    Decide which Permissions to assign (Can choose more than one)

    • Read access
    • Edit payments profile
    • Sign-up and purchase
    • Manage users
    • Admin with all permissions

    Get the GMAIL Address of the Assignee

    1. Should be (and only be) GMAIL Address.

    Step By Step Guideline on assigning Access Rights of Google Payments Center to others

    As an Assignor

    1. https://payments.google.com/1
    2. Settings > Manage users
    3. + Add a new user
      • Contact name = <<ASSIGNEE_NAME>>
      • Email address = <<ASSIGNEE_EMAIL_ADDRESS>>
    4. Permissions = admin with all permissions
    5. Email preferences = All payments email

    As an Assignee

    <<TBC>>


    Footnotes

    1. User the Gmail address same as the login of the Google Ads Account which you are going to link up with the Google Payments Center. ↩︎
  • How to Assign Remote Desktop Access Rights to Technical Support

    How to Assign Remote Desktop Access Rights to Technical Support

    Definition


    What Problems Remote Desktop Access Solves


    Step By Step – As a Assignor

    Prerequisite

    1. Chrome Remote Desktop installed in Google Chrome

    Step By Step


    Step By Step – As a Assignee

    Prerequisite

    1. Chrome Remote Desktop installed in Google Chrome

    Setup Process for the Assignor (Granting Access)

    Step 1: Install Chrome Remote Desktop

    1.  Set up remote access >Download and install the Chrome Remote Desktop extension.
    1. Follow on-screen instructions to complete the setup.

    Step 2: Enable Remote Access

    1. Chrome Remote Desktop.
    2. Set up Remote Access > Turn On
    1. Choose a name > Next.
    1. Choose a PIN > start  <<at least 6 digits>> for security.

    Step 3: Share Access with the Assignee

    1. chrome Remote Desktop >Remote Support > Share this screen  >  Generate Code
    1. Send the generated Access Code to the Assignee.

    Step By Step – As a Assignee

    Step 1: Open Chrome Remote Desktop

    1. Connect to another computer>Access Code > Connect

    Step 2: Control the Remote Computer

    • Once connected, the Assignee can fully control the Assignor’s computer.
    • The Assignor can revoke access anytime by clicking Stop Sharing

    Disconnecting the Remote Session

    1. Close the Chrome Remote Desktop tab.
    2. The Assignor can click Stop Sharing to end the session.

    Troubleshooting Tips

    1. Ensure both computers are online.
    1. Verify Google Chrome and Chrome Remote Desktop are updated.
    2. Restart Chrome Remote Desktop if connections fail.
    3. Check that the correct Access Code is used

    Footnotes


  • Data Schema of Relational Table Importing to Graph Database – Execution

    Data Schema of Relational Table Importing to Graph Database – Execution

    Introduction

    In the earlier article titled Data Schema of Relational Table Importing to Graph Database – Dimensionality, we explored how to observe real-world data and transform it into a digitised format within a Relational Database. The greater the dimensions we account for, the higher the fidelity with which the Relational Database represents reality.

    In this article, we are going to transform the data stored in the Relational Database , to the Graph Database.


    Why to transform data from Relational Database to Graph Database

    While of course there are many ways for us to directly input the data into the Graph Database, there are still day to day scenario which we should input data into Relational Database before and transform them into Graph Database:

    Data already recorded in the Relational Database.

    Relational Database is much more popular than Graph Database. Most of the systems in most of the companies stored their data in Relational Database or in tabular format. 

    Common Form as the Input Interface 

    While we can use Cypher to input the data directly into Graph Database, the user needs to go through a long learning curve before they can master the new computer language Cypher. To provide a commonly used Form-style Input interface for the user for their CRUD activities will encourage the user to engage the system. 


    Problem Pattern – Solution – Data Schema Trio

    The next question you may ask is : So why do we need to use Graph Database instead of Relational Database?

    To answer this question, I will prefer to write in a trio of (1) Relational Database Problem Pattern – (2) Graph Database Solution – (3) Graph Database Data Schema such that all the 3 pieces of information will be interrelated, even though it may not map the content with the title of (1),(2) and (3) explicitly.


    Relational Database Problem Pattern – Lack of Recursive Relationships

    Table Citizen

    Citizen#First NameLast Name
    1001BarbieStereotypical
    1002BarbieWeird
    1003KennethCarson

    While table Citizen is a typical relational data table which perfectly records the information (i.e. the 3 properties) of the 3 people (i.e. there are 3 records), can you imagine how to record the relationships among the records inside the same table?

    For example, what if I want to record the facts:

    1. Feb : Stereotypical Barbie in relationship with Kenneth
    2. March : Stereotypical Barbie broke up with Kenneth
    3. April : Weird Barbie in relationship with Kenneth
    4. May : Stereotypical Barbie also reunion with Kenneth at the same time

    May be you have throught of to append new columns is...of and Target at the end of the table Citizenas below:

    Citizen#First NameLast Nameis….ofTargetDate
    1001BarbieStereotypical Girl friendKennethFeb
    1002BarbieWeird Girl friendKennethApril
    1003KennethCarsonBoy friendStereotypicalFeb

    You will immediately realize that you cannot record both fact#1 and #2 at the same time. If you record #1 in Feb and modify it to #2 in March, you will miss the historical record of their relationship.

    On top of that , you will also need to modify both Record#1001 and #1003 at the same time after they broke up as both #1001 and #1003 are in fact describing the same fact in different directions. (i.e. Stereotypical is Girl friend of Kenneth, and Kenneth is the Boy friend of Stereotypical), which we called this update anomaly in relational database.

    Besides, also we cannot record both fact #3 and #4 at the same time because there is only 1 value able to be recorded in is...of Column.

    It seems that a normal tabular table cannot handle the fact descripting the relationship among different records inside the same table. This data pattern is regarded as Recursive Relationship.

    In order to remedy the shortcoming, a new table, which is classifie as a Bridge Table, Love-Relationship is necessary to be created to record the recursive relationships among the records in the same table Citizen as below:

    Love-Relationship#DateSubjectis….ofObject
    2001FebStereotypical BarbieGirl friendKenneth
    2002FebKennethBoy friendStereotypical Barbie
    2003MarchStereotypical BarbieEx-Girl FriendKenneth
    2004MarchKennethEx-Boy friendStereotypical Barbie
    2005AprilWeird BarbieGirl friendKenneth
    2006AprilKennethBoy friendWeird Barbie
    2007MayStereotypical BarbieGirl friendKenneth
    2008MayKennethBoy friendStereotypical Barbie
    2009MayStereotypical BarbieRivalWeird Barbie

    Graph Database Solution

    In Figure 1 which is built by a Graph Database, you can cleary and easily address all the facts #1,#2,#3,#4 mentioned previously. All fidelity is preserved via Graph Database.

    You may realize that some of the relationships inside the Graph Database may be duplicated or redundant. For example, there is no need to record both directions of the Rival relationship between the 2 Barbies. While we call that Direction in Graph Database, this is not our focus in this article and we will leave the discussion in the later session of this paragraph.

    Graph Database Data Schema

    Below is teh Graph Database Data Schema in Cypher, which creates the graph shown in Figure 1 :

    // Figure 1 - Create nodes with Label: Citizen
    CREATE (:Citizen {firstName: "Stereotypical", lastName: "Barbie"});
    CREATE (:Citizen {firstName: "Weird", lastName: "Barbie"});
    CREATE (:Citizen {firstName: "Kenneth", lastName: "Carson"});
    
    // Relationships for February
    MATCH (stereotypical:Citizen {firstName: "Stereotypical", lastName: "Barbie"}),
          (kenneth:Citizen {firstName: "Kenneth", lastName: "Carson"})
    CREATE (stereotypical)-[:Girlfriend_of {month: "Feb"}]->(kenneth),
           (kenneth)-[:Boyfriend_of {month: "Feb"}]->(stereotypical);
    
    // Relationships for March
    MATCH (stereotypical:Citizen {firstName: "Stereotypical", lastName: "Barbie"}),
          (kenneth:Citizen {firstName: "Kenneth", lastName: "Carson"})
    CREATE (stereotypical)-[:Ex_Girlfriend_of {month: "March"}]->(kenneth),
           (kenneth)-[:Ex_Boyfriend_of {month: "March"}]->(stereotypical);
    
    // Relationships for April
    MATCH (weird:Citizen {firstName: "Weird", lastName: "Barbie"}),
          (kenneth:Citizen {firstName: "Kenneth", lastName: "Carson"})
    CREATE (weird)-[:Girlfriend_of {month: "April"}]->(kenneth),
           (kenneth)-[:Boyfriend_of {month: "April"}]->(weird);
    
    // Relationships for May
    MATCH (stereotypical:Citizen {firstName: "Stereotypical", lastName: "Barbie"}),
          (weird:Citizen {firstName: "Weird", lastName: "Barbie"}),
          (kenneth:Citizen {firstName: "Kenneth", lastName: "Carson"})
    CREATE (stereotypical)-[:Girlfriend_of {month: "May"}]->(kenneth),
           (kenneth)-[:Boyfriend_of {month: "May"}]->(stereotypical),
           (stereotypical)-[:Rival_of {month: "May"}]->(weird);
    

    The comparison between of the Dimensionality of the Data Schema between Relational Database and Graph Database are as below:

    DimensionRelational Database Data SchemaGraph Database Data Schema
    1-DAttribute (Column)Node Properties
    2-DRecords (Row)Node
    3-DTableLabel
    4-DBridge TableType (i.e. Edge)
    5-DAttribute in Bridge TableType Properties

    The Graph Database perfectly caters the recursive relationships between different records inside the same Table in Relational Database. 


    Relational Database Problem Pattern – Data Duplication

    In fact, when we created a new Bridge Table, Love Relationship Table in this case, you will find that both the names of Stereotypical Barbie, Weird Barbie and Kenneth Carson had been shown up more than once inside the Love Relationship Bridge Table, as well as duplicating with the records inside the Citizen Table. (e..g you can find Stereotypical Barbie in both Love Relationship Table and Citizen Table)

    This data duplication made the description about the reality lose its fidelity that while the database records Stereotypical Barbie (and all other people) more than once, in reality there is only one Stereotypical Barbie. There is discrepancy between the records (i.e. the Model) and the reality.

    The Graph Database , on the contrary , records Stereotypical Barbie once, which precisely describes the fact that there is one and only one Stereotypical Barbie in reality. 


    Relational Database Problem Pattern – Lack of Functional Dependency

    Recall in the previous paragraph that a Recursive Relationship (or self-referential relationship) is the relationship betweens any of the 2 (or more) records inside the same Relational Table. 

    If Recursive Relationship is describing the vertical dimension of a relationship, (i.e. whenever you add a new record in a table, the length of the table will be extended vertically.) Functional Dependency , on the contrary, is describing the horizontal dimension of the relationship.  (i.e. whenever you add a new column (i.e. attribute) in a Table, the length of that Table will be extended horizontally).

    Functional Dependency is referring to a specific column (attribute) in a table ,is dependent on another column (attribute) in the same Table.

    Let’s illustrate the concept Functional Dependency with the example table Citizen in below:

    Citizen#First NameLast NameGender
    1001BarbieStereotypicalF
    1002BaribeWeirdF
    1003KennethCarsonM

    With common sense, we can infer by the attribute First Name that Baribe should be a Female, while Kenneth should be a Male. We can say that the attribute Gender is dependent on the attribute First Name. (regardless of their Last Name, of course). 

    This kind of dependency is called Functional Dependency.

    Thanks to the transformation of SQL, the 2 most popular Relational Databases, MySQL and MariaDB , started supporting the SQL Keyword CHECK after the version 8.0.16 and 10.3.10 respectively. By using SQL Keyword CHECK, we can apply the functional dependency by adding the CONSTRAINT in the SQL statement as Figure 2 in below:

    // Figure 2 - Create Relational Table and associated Constraints
    CREATE TABLE Citizen (
        Citizen# INT PRIMARY KEY,
        First_Name VARCHAR(50),
        Last_Name VARCHAR(50),
        Gender CHAR(1),
        CONSTRAINT chk_gender_ken CHECK (First_Name = 'Ken' AND Gender = 'M' OR First_Name <> 'Ken'),
        CONSTRAINT chk_gender_barbie CHECK (First_Name = 'Barbie' AND Gender = 'F' OR First_Name <> 'Barbie')
    );


    The compatibility of the SQL Keyword CHECKis in fact a good move and big move in relational database world which makes our coding life much easier, until you realize that you have to hard code the constraints (i.e. the rules) into the SQL.

    What if there are 10,000 known First Names in the world and I want to turn them all to the constraint? 

    Obviously it is extremely hard , if not impossible , for any programmer to hard code the constraint into the SQL statement, not to mention these 10,000 additional SQL CONSTRAINT statements will significantly drag down the performance of the query.

    Moreover, whenever an end-user of the system discovers a new First Name and wants to add it into the CONSTRAINT fleet, there is no way for the end user to insert the new CONSTRAINT as you will not expect him/her to write the SQL statement himself / herself. The Extensibility of the system is suck.

    In order to cater the extensibility problem, how about if we create an additional lookup Table FirstNameGenderRule to restore all the rules as below:

    Rules#First NameGender
    3001BarbieF
    3002BaribeF
    3003KennethM

    In this sense, every time before a new record is inserted into the Table Citizen, a constraint lookup to the Table FirstNameGenderRule will be triggered in order to validate the value in the Gender of the record.  Whenever a new First Name is found, the end-user can append a new record in this FirstNameGenderRule Table to a new rule via the user Form.

    While this method makes perfect sense and served the functional dependency as well as solved the extensibility problem of the system, the nature of this FirstNameGenderRule is similar to the Bridge Table we have mentioned previously in this article, which the data redundancy is happened again due to the fact that the value of both First Name and Gender stored twice in both Table Citizen and FirstNameGenderRule.

    Meanwhile, in the Graph Database, in order to cater both the functional dependency objective and cater the extensibility problem of the system, we come up a Cypher solution in Figure 3 below:

    // Figure 3 - Create Rule Node
    CREATE (:Rule {FirstName: 'Ken', Gender: 'Male'}),
           (:Rule {FirstName: 'Barbie', Gender: 'Female'}),
           (:Rule {FirstName: 'Sam', Gender: 'Non-Binary'});
    
    // Figure 3 - Validation
    MATCH (c:Citizen)
    OPTIONAL MATCH (r:Rule {FirstName: c.FirstName})
    WHERE c.Gender <> r.Gender
    RETURN c.CitizenID AS ViolatingCitizenID, c.FirstName AS FirstName, c.Gender AS CitizenGender, r.Gender AS ExpectedGender;

    Based on the 3 Nodes (i.e. 3 records) under the Citizen Label we have already created in Figure 1, simply create 2 Nodes for the 2 constraint rules. You can of course put these 2 Nodes under the Label FNGenderRule to categorize the rule Nodes

    In the future, whenever a new First Name is found, we can simply add a new Node under the FNGenderRule Label and that is!

    Once you run the WHEREclause in Figure 3, all the unvalid entry will be filtered out. (and modify automatically by using the SET keyword if you want. But i will skip this part.)

    Unfortunately , when we look closely at the newly created FNGenderRule Node, we may realize that in fact the property of First Name and Gender still exists and is duplicated with that of the columns in Citizen. We cannot fix the data redundancy in Graph Database either.

    Maybe you think crazily enough like me to externalize every single properties to become a node. Nevertheless, even though you can write the Cypher to execute like we have done in Figure 4 below:

    Figure 4 bGraph Functional Dependency Citizen Properties Not Linked
    Figure 4 bGraph Functional Dependency Citizen Properties Not Linked

    While in the first insight it sounds we have served the functional dependency and extensibility requirements without sacrificing the data redundancy, in fact we have just created another worm-hole.

    The question we should ask : how do we interpret from Figure 4 that {Kenneth, Carson, Male} is in fact the property of a Citizen?

    Unfortunately, there is no way for us to link up the Nodes Kenneth, Carson and Male. Even though if you can, you may spend much more time than the benefit you gaining from solving the data redundancy problem.

    And therefore, you keep optimizing your data model by using the Citizen# as the Label of each leaf Nodes such that you can filter out a specific Citizen based on the Citizen# inside the Label like Figure 5 in below: 

    Figure 4 bGraph Functional Dependency Citizen Properties Linked By Label
    Figure 5 bGraph Functional Dependency Citizen Properties Linked By Label

    While technically and theoretically it is feasible, before you model your data in this way, think about what if there are 1,000,000 citizens, and what if you need to update/delete/modify the value of a record? And what if Kenneth changed his name from Kenneth to Ken? You need to firstly add a new Node Ken and then delete the Node Kenneth.  

    This operation is just not worth compared with the benefit brought from the data redundancy.


    Relational Database Problem Pattern – Data Duplication


    Relational Database Problem Pattern – Data Duplication

    Conclusion


    Footnotes


  • Data Schema of Relational Table Importing to Graph Database – Dimensionality

    Definition


    Relational Table

    The Table is the fundamental components inside a Relational Database which stores data in tabular format using Column and Row to coordinate a specific Value (i.e. the Cell). Form and Table (i.e. Tabular format) are everywhere in your daily life.

    Data Schema in Relational Database

    A data schema in a Relational Database is a blueprint or structure that defines how data is organized, stored, and related within the database. It describes the database’s logical design and covering when and what to create Table, Columns , Index, Contraints, Relationship and Data Type inside a Table in a Relational Database

    Graph Database

    A graph database is a type of database that uses graph structures to represent and store data. Instead of organizing data into rows and columns like relational databases, graph databases focus on relationships and connections between data points.


    Objective of Importing Data From Relational Table to Graph Database

    While Graph Database can be acting as the Enterprise Knowledge Base which can speed up the learning curve of both staff and client , how to import the data into the Graph Database is a challenge. 

    As data with Tabular format is dominant in the world, it is inevitable for us to import data from a Relational Database to a Graph Database. There are few ways that we can import the data into the graph database:

    1. Directly coding by Cypher Cypher is a Graph Query Language , as if the SQL in relational database
    2. Import both the data schema (i.e. the metadata. E.g. datatype, column constraint) and the business data (i.e. a normal record inside a table in a relational database) directly from the relational database)

    While graph databases are not common in the general public, it seems that both of the methods required some kind of expertise in order to get the job done. Besides, the methods above are good for batch importing. If you want to import the data in piecemeal, it is not handy.

    It is necessary to have a normal input Form (just like the Form you can see every day in your life) which has zero learning curve for the user to import the data manually into the graph database.


    Data Types

    The wording “Data Type” has a different meaning. it can be referring to the description of the data format , e.g. a column in a Form which can only input a value of Integer , decimal ,text, or a autonumber. 

    Instead, Data Type has another meaning which is used to classify data as Business Data, Metadata and Model Data. For details about the difference between the 3 , it is strongly recommended you to read the article bGraph Architecture – Model Data beforehand.

    The focus of this article is for catering the latter.


    Interpreting Relational and Graph Database in a Dimensional Perspective

    Before we dive into the problem pattern and its paired solution on importing the data from a relational table into a graph database, the concept of interpreting data in terms of dimension is crucial for us to understand what and why we are solving the problem in the way we did.

    What is Dimension

    By definition, In physics, a Dimension is a space that can be measured and extended. For example:

    Dimension (x-D)Example of UnitExample in Reality
    0-DN/Aa point (or a Spot)
    1-Dcma Line
    2-Dcm2a Plane (or an Area)
    3-Dcm3a Volume
    4-DHourTime
    5-D????

    Relationship Between Dimension and Vector

    A practical purpose of the concept “Dimension” is to coordinate something. 

    For example, can you tell me where the alphabet “A” is in the Line below?

    ______A___

    While the “A” is definitely not in the middle, it is not in the starting or ending point of the line either. You can say it is right-stewed , but cannot exactly tell.

    How about now?

    123456A89

    Now you can confidently say that the “A” is located in the position “7” of this 9-unit-long Line.

    The Line is regarded as “1 dimension” because you can measure the length of the line (1-9) in width (and only width) , but not in height or in depth or in time. 

    DimensionCo-ordinate of Data Point Example
    0-DN/A
    1-D{1}
    2-D{1,2}
    3-D{1,2,8}
    4-D{1,2,8,10}

    So it is quite easy to understand that the amount (or you can say the “digit”) of data points is exactly the same as the degree of dimension. Whenever you want to coordinate an additional dimension, simply add an additional data point (i.e. the digit) into the array.

    In mathematics , we call this long number and extensible array (e.g. {1,2,8,10}) as Vector, which is the concept under the mathematics branch of Linear Algebra

    While as a human being we cannot imagine a material object in a 5-D physical world, there is no limitation on how many dimensions you can add in mathematical world.  In fact , you can add 100 , 1,000 or 10,000 data points into the Vector if needed, as long as you can think of the use case (e.g. to coordinate something) and provided that you have sufficient computing power to do the vector calculation and operation.

    That’s the reason why even the Graph Theory coined almost 300 years before, and computer existed almost 90 years, we still didn’t hear of Graph Database until this 1 or 2 decades (may be because you were not even born!) due to the limitation of the computational power and infrastructure.


    Relationship Between Dimension and Database


    0-Dimension in Database

    As mentioned before, the main purpose of a Vector is to coordinate a data point. In fact , coordinating something is the initial step of “Searching”. 

    What is the benchmark of whether we can successfully coordinate something mostly depends on whether the coordination can refer to one and only one outcome (i.e. singleton) 

    Allow me to start with an example based on 2023 Barbie film.


    Imagine in a country ,Barbie Land, Barbie1 is the one and only one citizen. To record Barbie as the citizen of this country (most likely Barbie will be the one who carries out this recording task!), Barbie can simply record like below:

    Barbie

    That is!

    While there is one and only one citizen in this country, every time anyone talk about “Barbie” in this country, the word “Barbie” can uniquely identity the material substance of the person who is referring to , which means it can perfectly and good enough to “coordinate” the one and only one material substance citizen “Barbie” in Barbie Land.

    You can regard this “Cell” as 0-Dimension because there is one and only one value, and there is no any direction for you to extend horizontally or vertically. (Remember the definition of Dimension?)

    0-Dimension : In terms of Data Structure, only one and only one Cell which stored the Value.


    1-Dimension

    When someone outside Barbie describes Barbie, he/she may say that Barbie is 29 cm height , the citizen of Barbie Land. If height = 29cm , citizenship = Barbie Land, then X = Barbie , what is the “X”?

    Obviously the X = Name.

    In order to faciliate others to describe the material substance object (i.e. Barbie herself), we can add an additional Cell on top of the Cell Barbie as below.

    By applying the definition of Dimension, you can realize that the Cell (i.e. 0-Dimension) had been added an additional Cell Name and turn it to a vertical line (i.e. a Column). Therefore, the data structure had been transformed from 0-Dimension to 1-Dimension.

    From Now on , you can call this data structure as Column.

    1-Dimension : In terms of Data Structure, when a “Column Name” is appended on top of the 0-Dimension Cell, it can be regarded as 1-Dimension.


    2-Dimension

    One day, when Barbie experienced the imprefection of herself , she realized that she is in fact only a stereotype. She therefore gave herself a Last Name as below:

    First NameLast Name
    BarbieStereotypical

    When a column Last Name is added, the word “Name” is not enough to differentiate between the two. And to uniquely identify the two , the “First” and “Last” are added in front of the “Name”. 

     
    You may find the pattern that whenever you want to uniquely identify some objects, simply attach some attributes (e.g. Last Name) to that object, in order to let the Name refers to one and only one instance. (This is the definition of the word “Definition”!)

    Back to our database use case, as now an additional Column is attached to Barbie, you can see the data structure is in fact extended from a Column (1-Dimension) to a Plane (2-Dimension). If you remember the vector example, you can write it the vector as {Barbie, Stereotypical} .

    From now on, you can call this Plane as Table.

    2-Dimension : In terms of data structure, whenever there are 2 columns with a Column Name and 1 Record, it can be regarded as 2-Dimension.


    Adding a New Record in 2-Dimension

    As time goes by, the population of the Barbie Land increased 100% from 1 person to 2 people , of which the newbie is also named Barbie.

    First NameLast Name
    BarbieStereotypical
    BarbieWeird

    Applying the same logic of the definition of Dimension, although an additional record , i.e. Barbie Weird, is appended to the list, the data structure is still in 2-Dimension as the new record by itself does not extend to any new direction. (it extended vertically which this direction already existed before.) That means no matter how many records you added, the Table is still in 2-Dimension.


    Adding a New Column in 2-Dimension

    Although logically anyone can classify 2 Barbies with different First Name and Last Name, in reality as the 2 Barbies will not seal their name in their forehead, there is no way to teach a person who never see them before to differentiate between the two.

    Having discussed with this problem, in order to uniquely identify themselves visually, the 2 Barbies agreed to give a Hair Style describe to themslves as below:

    In this case, a obversable character is needed to enrich the data structure, letting the information inside the data structure more close to the reality.

    First NameLast NameHair Style
    BarbieStereotypicalFloating
    BarbieWeirdQuirky

    Applying the same logic of the definition of Dimension, although an additional column , i.e. Hair Style, is appended to the Table, the data structure is still in 2-Dimension as the new Column by itself does not extend to any new direction. (it extended horizontally which this direction already existed before.) That means no matter how many Columns you added, the Tabel is still in 2-Dimension.


    3-Dimension

    It seems the 2-Dimension Table can describe the reality of the Barbie Land well until both Barbies want to create a sunglasses list which can help her to manage all your eyewear in their wardrobe.

    After hours of effort , they created the sunglasses list as below:

    As a new Data Table is created, here raised another question : How to uniquely identitiy the 2 Tables during communication?

    Well, as you can think of, simply giving the name to each of the 2 Tables can solve the problem.

    Sunglasses#Sunglasses StyleSunglasses Frame Color
    S01Cat-Eye FrameOrange
    S02AviatorDeep Blue
    S03SportySilver

    Therefore, Stereotypical Barbie name the 2 Tables as Citizenand Sunglassesrespectively.

    Same as your life, the 2 barbies just open a can of worms. While both Citizenand Sunglasses by itself are 2-dimension objects (i.e. a Table), listing out 2 Tables , referring to the definition of Dimension,  will create another new Dimension (2 Tables are definitely measurable and you can extend as many objects (i.e. Tables) as you want in the same direction).

    And therefore, a 3-Dimension data structure is just born! Now you can call this 3-Dimension data structure as Database.


    Testing The Theory From 1 to 3 Dimension

    It’s time for us to take a deep breath before we dive into the 4-Dimension data world. Limited by the human brain’s structure, any dimension higher than 3 will be hard to visualise and project in our brain. Therefore we have to make sure we are acquainted with the 0-3 Dimension concepts well.

    The next question is, how do we prove that our 0-3 Dimension data structure theory is correct and practical?

    Let us back to the basics of why we have to build the data structure. This is the fundamental objective of the information system. The logic is as below:

    1. Making decision will bring value in the real world
    2. Decision Making Quality affects the value of Decision Making.
    3. Accurate, timely and relevant Information will facilitate the Decision Making Quality.
    4. Information is refined from how we analyze and process (e.g. egress, load and transfer) the Data in the Database.
    5. The Data stored in the Database is classified as Descriptive Data and Inferential Data.
    6. Descriptive Data is from Real World Observation.
    7. Inferential Data is the product of both Descriptive Data and Intelligent (i.e. how we analyse the data, for example using logistic regression model to classify the Descriptive Data). 

    To streamline the deduction steps above, you can conclude that the purpose of the Information System is that the user of that Information System (i.e. the Database) can simply make the decision by observing the world, leaving all the processing and analysing steps to the Information System. 

    And hence, whether or not the database is competent or not depends on whether the data stored can reflect the reality in fidelity (i.e. is it descrptive enough) and uniquely identify the underlying objects found with the real world (i.e. co-ordinating) , while leaving the inferential duty to other system. (e.g. an AI facial recognition system)

    It is straightforward that we can test the fidelity of the database by asking simple questions in below:


    Q1: How many citizens are there in Barbie Land?

    A1: Two.

    By counting the number of records (i.e. Row) in the Table Citizen, we can easily figure out there are 2 records in the Table Citizen.

    The 1-Dimension data structure (i.e. any of the Column inside the Table) perfectly performs the task on description the objects in reality, and hence it can be regarded as a competent database.


    Q2: Please describe the citizen in Barbie Land whose last name initialized with “s” ?

    A2: Steretypical Barbie is the citizen in Barbie Land who has a floating hair style.

    By filtering the Last Name column in the Table Citizen , you can easily describe the object (i.e. the record) by finding out its First Name, Last Name and Hair Style

    This 2-Dimension data structure (i.e. Database) perfectly performs the task on description and co-ordinating the object in reality, and hence it can be regarded as a competent database.


    Q3: What object types can be found in Baribe Land? and how many instance in each object?

    A3: 2 Citizens and 3 Sunglasses can be found in Barbie Land.

    By enumerating all the Tables inside the Database, we can easily answers the question Q3.

    This 3-Dimension data structure (i.e. Database) perfectly performs the task on description and co-ordinating the object in reality, and hence it can be regarded as a competent database.

    You can see that up to now , the existing 1 to 3-Dimension data structure perfectly answers the 3 questions above, until we start asking another type of questions : 4-Dimension question.


    4-Dimension

    Let’s start the 4-Dimension session with a question and you will realize the limitation of the 3-Dimension data structure.

    Q4: What is the wearing habit of the Citizens in Weekday?

    While we already have the Table Citizen and Sunglasses to record each individual citizen and sunglasses, these 2 Tables do not describe the Relationship between the 2.

    If we tried to record the mix and match wearing observation in existing Tables, no matter which Table (Citizen or Sunglasses) , it will look like this:

    WeekdaySunglasses#Sunglasses StyleSunglasses Frame ColorCitizen
    MondayS01Cat-Eye FrameOrangeStereotypical
    MondayS03SportySilverWeird
    TuesdayS02AviatorDeep BlueWeird
    TuesdayS03SportySilverStereotypical

    The Table above sacrificed the fidelity the reality provided in answer of Q1 (i.e. How many citizens are there in Barbie Land?) as some of the citizen are duplicated in the records such that we cannot simply count the records to answer the question. (i.e. There are 4 records in total but in reality it got only 2 sunglasses and 2 citizens) 

    In order to solve the problem, instead of appending the additional columns into any of the existing Tables , it is a better way to create 2 additional tables – WeekDay Table

    Weekday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday

    Together with the Mix and Match Table that we just created:

    WeekdaySunglasses#Sunglasses StyleSunglasses Frame ColorCitizen
    MondayS01Cat-Eye FrameOrangeStereotypical
    MondayS03SportySilverWeird
    TuesdayS02AviatorDeep BlueWeird
    TuesdayS03SportySilverStereotypical

    Now there are 4 Tables in Total inside the Database:

    1. Citizen
    2. Sunglasses
    3. Weekday
    4. Mix and Match

    However, when you observe carefully, you can realize that in fact the terms Mix and Match has no records and does not exist in reality. Instead, the concept Mix and Match is a concept (i.e. a Relatoinship) rather than a material substance which can be observed. 

    If you still have no idea what i am talking about, let’s recall the table Citizen that we have created during the 2-Dimension session:

    First NameLast NameHair Style
    BarbieStereotypicalFloating
    BarbieWeirdQuirky

    Can you realize that you cannot exactly find any material substance of “Citizen” inside the Citizen Table? It is because the terms Citizen is a Class , while the 2 Barbies are records are the Instance. There is no material subtance for the term Citizen.

    Same phenomenon happended in other Tables that you can only find the Instance instead of the Class inside the records in any tables.

    If you think this logic make sense and apply to the table Mix and Match , you may now realize that the concept Mix and Match is a Class instead of an Instance which cannot be found inside the record of the Table Mix and Match.

    As we just created a new Class Mix and Match to consolidate all the 3-dimesion Tables Citizen , Sunglasses and Weekend , that means another new Dimenion , 4-Dimension, had been created.

    If we visualize all the relationships of all concepts mentioned throughout the paragraph via the Entity Relationship Diagram, it will become the diagram in below:

    Barbie Land Mix And Match Entity Relationship Diagram
    Barbie Land Mix And Match Entity Relationship Diagram

    4-Dimension+

    So, it is possible that i can build infinity number of Dimensions of the data structure inside the database? Yes, in theory you can. Whenever you cosolidate all the instance in the same Dimenion and form a list, you created a new Dimension.

    As long as you understand how we use the dimensionality in the data structure to describe the real world, we can stop the example in 4-Dimension.


    Conclusion

    In this section we just introduced how we observe and describe the reality and fit them into a Relational Database via a dimensional way, as well as how we create a new dimension by gathering all instance in lower dimension to form a new class in the upper dimension.

    In next article, we are going to address the problems that the Relational Database suffers, and how we fit the Relational Database into the Graph Database to compensate the problems suffered by Relational Database.


    Footnotes

    1. Please refer to the Barbie film 2023 in order understand why we use the name Barbie as an example. ↩︎
  • What Problem Patterns bGraph Is Going to Solve

    What Problem Patterns bGraph Is Going to Solve

    Introduction

    bGraph is an SaaS developed in-house by Diamond Digital Marketing Group which can be categorised as a GraphRAG web application serving as an Enterprise Knowledge Graph.

    To better understand what GraphRAG exactly is, it is imperative for us to start with a real world problem pattern


    Real World Problem Patterns

    The definition of profit is simply Sales Revenue Minus Cost. While in the legal aspect, an cost item of Labour Cost (e.g. Salary) is good enough to meet the legal duty in terms of financial report, it cannot be in the real world reflects the problem that how the 40 Hours x 4 Weeks working hour for a staff is distributed among different activities throughout his/her daily operation. Instead of presenting the cost in monetary terms, I would like to convert it into Time.

    In almost any industries or any business model we can categorize the types of time cost in below:


    Production Time Cost

    In a service-oriented business, Production Time Cost is simply referring to the time a staff spent on rendering a service to the client. For example, a hair dresser spent 30 minutes on providing hair styling service to the client. This 30 minutes will be categorized as Production Time Cost.

    In a sku-oriented business, Production Time Cost can be categorized as the time on any kinds of labour cost incurred between planning to product delivered to the client. For example, even if you sell a Clock online, not only the Time Cost the Product Manager should be spent on designing and manufacturing the clock, the Customer Service Officer also needs to spend time on answering the enquiries from the wholesale or end-user clients. 

    Communication Time Cost

    Communication Time Cost is indispensable in business world. We can easily find the Communication Time Cost in scenarios below:

    Communication between staff to client

    1. Reporting (e.g. Sales Report, Order History)
    2. Documentation (e.g. Invoice , Quotation, Shipping Note)
    3. Enquiries from Clients

    Communication between staff to staff

    1. Reporting (e.g. Monthly Report)
    2. Knowledge TransferMeeting
      • e.g. In a brainstorm marketing meeting in a digital marketing agency which the salesperson needs to transmit the requirement and the marketing parameters acquired from the client to the marketer team such that the marketer team can formulate a digital marketing strategy based on the input from the salesperson.
    3. Knowledge TransferTraining and Learning
      • e.g. A new staff onboard which he/she can be competent to his/her job duties when time goes by based on below:
        • Operational Manual Reading – 10%
        • Advice from supervisior and teammate – 10%
        • Hands-on practicing – 30%
        • Trial and Error , feedback and complain from supervisior or client – 50%
    4. Knowledge Not Transferred
      • e.g. Imagine 1000 hours had been spent by the staff on designing and developing a new product , system or skill. When the staff quit the organisation, the knowledge that he/she acquired will be left together with him/her if there is lack of knowledge management practice in the organisation.
    5. Communication by Optimisation
      • e.g. A client requested to the web designer that he want the font-size in the website “Bigger”. Whenver the web designer modified the font-size from “12pt” to “24” pt, and then the client responsed that the font-size is “Too Big” this time. So the web designer by trial and error to adjust the font between “12pt to 24pt” a few times, and finally optimized in font “18pt”.
    6. Instruction Placing
      • e.g. An Marketing Director ordered the Marketing Manager in his/her team to prepare for the Consolidated Marketing Report with the followng specifications which is different each time:
        • CTR
        • CPC
        • CPM
        • CPA
        • ROAS

    Searching Time Cost

    Searching Time Cost can be derived from following scenarios:

    1. Bad Naming Convention
      • e.g. a Sales Report File named as “Report.pdf“, which the name in itself cannot differentiate among other reports created in/by different time, purpose and person.
    2. Lack of Indexing
      • e.g. Reinvent a new wheel – A staff spent 20 hours to created a comprehensive operational manual covering all his job duties. However, one day when this staff quit and the new staff does not realize the existence of that operational manual and then he spent another 20 hours to write a new one.
    3. Not Semantic Search Friendly
      • e.g. One staff member created a “Client List” and put it in the company drive , while the user searched “Customer List” in the company drive and then no result came out as he did not realise that he needed to search “Client” instead of “Customer“. After 15 minutes back and forth with different staff, he finally realized that he should search “Customer“.
    4. Lack of centralized data repositary
      • e.g. A Prospect discussed the project with the staff via Personal WhatsApp , WhatsApp group, Email, Phone Call , MS Team Video Meeting and Face to Face Meeting (with minutes). Having also checked with the CRM , Facebook CRM and eDM sending record, the staff spent 1 hour to consolidate all the data into the CRM contact log and let his supervisor review the whole picture before they can decide what to do next for closing a deal.

    Error Handling Time Cost

    Error Time Cost can be derived from following scenarios:

    1. Time Cost on doing wrong thing
      • e.g. Spent 1 hours to go east while it is expected to go west.
    2. Time Cost on undo the wrong step
      • e.g. Spend 1 hours to redo the error and go back to the original starting point.
    3. Insurance cost on monitoring and addressing the error
      • e.g. In order to address the wrong direction as soon as possible , the driver should report to the head office hourly. Besides, each car should install a GPS system (i.e. cost incurred) to trace the real-time position of the car.
    4. Time Cost Ripple EffectError brings New Error
      • e.g. While most of the time in a business world, how to do Step 2 will be dependent on the output of Step 1, and Step 3 dependent to Step 2 , so on and so forth, going wrong in Step 1 will trigger a ripple effect to lead Step 2 and Step 3 all go wrong.
    5. Time cost on Error Identification
      • Imagine you are using WordPress to build a website in which you have installed 100 plugins to make the WordPress website workable. However, after this 100 times installation, an error message came out which made your whole website shut down. You have no idea which plugins cause the error. The only way you can find out the root cause is to deactivate all the 100 plugins and start installing and observing the plugins one by one to see when the error occurs. The more plugins you have , and the more error messages you get, the exponential the error handling time cost will go.

    Research and Development Time Cost

    Error Time Cost can be derived from following scenarios:

    1. System Development
      • e.g. You want to write an operational manual to describe a step by step guideline on how to run the procedure at a hair-dressing salon from client walk-in to client leave after service rendered.
    2. No record on “Dark Matter”
      • e.g. Imagine there is a problem in which your staff have spent 1 day testing out all the 10 possible solutions. Finally you find out there is 1 and only 1 solution that is feasible among the 10. However, the staff quit and he did not record all the 9 remaining “Not Solutions“. A new staff on board and as he wants to improve the existing 1 solution, he starts his research and goes through the other 9 “Not Solutions” again. 

    You can imagine that among all these Time Cost, only a very small portion of Time Cost is observable and measureable. The Time Cost which is not observable and measureable can never be cut or minimized.


    Ways of handling the Time Cost

    There are 3 directions on handling the Time Cost

    Eliminate the Cost Item

    Directly and brutally cut the item derived the cost. For example, streamline the workflow from 10 steps to 9 steps

    Minimize the Cost

    1. By systemizing the workflow to cut the communication and training cost
    2. By automating the workflow to cut the labour cost

    Turn Cost from expenses to assets in nature

    1. Build a do-once-use-many-times system. For example, once you write a Sales Script covering all the possible scenarios from a conversational sales meeting, this Sales Script can be applied to many sales meetings with same types in the future until the underlying environment changed. This kind of time spending , even though it is still a Cost, can be classified as Assets instead of Expenses because this Cost will generate future revenue.

    Applications which can handle all the Problem Patterns

    After years of hands-on experience (this is a black box and don’t ask me how and why I know! Thsi is an human intelligence before artificial intelligence dominates this world), you will realize the application can take 3 steps (or directions , to be precise) to handle all the time costs mentioned above:


    Enumeration

    By observing and modeling the world, you can address the relevant factors , steps, components, concepts that are related to your business.

    For example, when you are running an e-shop, you will realize different kinds of transactional emails or reports which will reflect the reality. This procedure is called Modeling.

    Modeling of an eshop Purchase Cycle:

    1. New User Registration Email
    2. New Order Email
    3. Invoice Email
    4. Receipt Email
    5. Delivery Note Email

    While the concept is easy to understand, it is extremely difficult to execute as you have to decouple each procedure, workflow, and concept into an executable encapsulated module which you can reuse or execute systematically.

    On top of that, it is a challenge for a Business Analyst or System Analyst to observe from the reality to refine the related components which comprehensively describes the model of the business. We called this comprehensive scenario Sample Space.

    For example, while every one will understand the concept “Client”, a Business Analyst have to decouple the concept “Client” based on following attributes in order to make it executable and more close to reality:

    1. User Journey – Prospect vs Client or 1st Time Client vs VIP
    2. Individual Client vs Enterprise Client.

    While the comprehensive option value lists of some of the attributes can easily be enumerated , most of the time most of the option value lists for most of the attributes cannot be enumerated in the time spot in which the system is built. More close to reality is that these option value lists, or even the attributes itselfs, are “growing” organically from time to time instead of being addressed in the very beginning.

    For example, even the option value of attributes Gender can be classified as Male , Female in old days and an additional option value Transgender nowadays.

    Also , what to observe in reality, and whether you think the component is relevant to your business or not highly depends on the level of knowledge of the Business Analyst. For example, in 4-year old you regarded water as water. But in 14-year old you should have realized the water can in fact be further decoupled by 1 H (Hydrogen) and 2 O (Oxygen).

    While we will not dive into the problem patterns that we suffered during the enumration process, enuermation by itself is the very beginning of the GraphRAG based Enterprise Knowledge Graph web application.

    In a techncial stack, we normally have the following technical components to execute the Enumeration process:

    1. Web Scrapper
    2. Public APIs (e.g. Public Facebook Post)
    3. Private Database and APIs (e.g. Company self-host CRM or Inventory System)
    4. UGC – Voice-to-Text conversation log or User submitted Documentations
    5. Modeling Blueprint – Meta Data , Data Schema , Business Lgoic, Compliance and Regulations.

    Indexing

    Indexing is the procedure to facilitate all the things or concepts in the Sample Space to be stored and searchable.

    For example, giving a Sales Order an Order Number (e.g. SO20323) is a common and easy way to “Index” an Sales Activities (and conceptualized via the document Sales Order).

    However, not anything can be easily indexed as simple as a Sales Order.

    While i am not going to dive into the problem patterns we suffered in the indexing procedure, we can in high level describe some of the indexing procedures for a solution application:

    1. Text Embedding to Vector Database – Instead of documentation level, indexing down to the level which is to index every single word written or spoken by a client into a vector database its searchability.
    2. Business Catalog in Data Lake – Indexing the Meta Data (i.e. the data of data, a Column Name of a Table, for example) via different data source (e.g. CRM / eDM / Inventory System / Booking System / e-Shop). For example, after you realized that there is a new option value “Transgender” under the attributes of Gender, you will need to index this new option value.
    3. Data Streaming – instead of indexing every single component in a batch (e.g. once per day), we index the data in real-time instream.

    Mapping

    Mapping is simply to find the relationship between 2 concepts. The challenge task is that you need to address which relationship is relevant to link up among tens of thousands of combinations. For example, when a customer service office asked the client to provide the Client ID# , the client forgot his/her Client ID# and simply provide a mobile phone number for the customer service office to lookup what the Client ID# is.

    In the above example , Client ID# and Client Mobile Phone Number is easy to map due to the fact that most likely that the Client Mobile Phone Number is linked to the Client Table itself. However , this ease does not apply to everything.

    For example, how can you figure out an Facebook Username “BillGates” is in fact referring to the same person in Instagram Username “ThisisBillGates” as they are using different wording to refer to the same object (person)?

    As usual, while we didn’t dive into details, we describe the techncial stack it normally be applied to do the mapping:

    1. Entity Resolution by Graph Database – find out same person with different name or wording under different data source.
    2. Link Preduction by Graph Database – find out the relationship between 2 concepts.
    3. RAG by Human Know-how – while LLMs is well trained by public knowledge domain, there is some domain specific knowledge which is in private , for example , the know-how of a 3-star Michigan chef on how to produce a perfect Risotto. Some sort of merchanism should allow the human to manually map the know-how into the Knowledge Graph Database so that the LLMs can apply its well-trained intelligent into the human know-how knowledge. (i.e. This is what RAG is performing)

    Searching

    Once all the concepts are enumerated and indexed , and the relationship among each concepts (we called it “Node“) are well defined and connected, we can start the Searching step.

    In fact, regardless of industry, job nature, role, task , business model, anything, as long as you ask a question, you are performing a “Search” activity.

    To execute a “Search” is to “Find a Needle (an instance) in Haystack (a pool of instances)”

    For example, when the customer service officer received the an enquiry from the client asking “When my Sales Order Delievered”, he then carry out the steps below:

    1. Get the Client Mobile Phone Number from the Client.
    2. Search (i.e. Lookup) the Client# by the Client Mobile Phone Number
    3. Search (i.e. Lookup) the Sales Odrer# by Client#
    4. Search (i.e. Lookup) the Shipping Record # by Sales Order#
    5. Search the value of the attributes “Shipping Status” and “Expected Delivery Date” inside the Shipping Order record.

    While the previous example is happened in a customer service scenario, the “Search” pattern also happens in the production team.

    In fact the search theory deserves a whole book to elaborate. We will skip the theory and directly highlighted the technical stack that we are going to use to carry out the Search Function:

    1. Search Bar or Chat Bubble – A search bar or Chat Bubble in the frontend interface which let the user to communicate with the system by inserting their search queries or questions.
    2. Semantic Search Engine – A search bar which the user can simply input human daily language , even though the search query is not 100% correct or precise. The Semantic Search Engine can still output some similar result even the search query is not 100% precise.
      • For example, when i search “GA4 Instell Guide” , the Semantic Search Engine will output the “Google Analytics 4 installation and configuration Guide” which connected to our Enterprise Knowledge Graph even thought there is a typo in the word “install” and the “GA4” is the synonyms of “Google Analyitcs 4“. (Although it is a norm in your daily to use Google Search Engine in this manner, don’t take this as granted as you can hardly find this semantic search function the search engine other than Google Search Engine.)
      • Another concept is that people in different role will use different language to refer to the same concept. For example, in a website design project, 3 differents role will use different wording to discuss the font size of the homepage:
        • Client : Please make the word in the title bigger
        • Marketer : Do you want a Font-Size = 20pt?
        • Programmer : I would prefer 1.1 em in order to cater both moble and desktop version.
    3. LLM – An highly intelligent “brain” (e.g. ChatGPT) which can comprehend and understand both the “Needle” and “Haystack” and perform the search and return the related outcome.
    4. LangChain – While LLM (e.g. ChatGPT) is good in understanding the text, in reality we need another AI model to comprehend Image (e.g. a AI model called Llama 3.2). LangChain is used to orchestrate the multimodel to make them work together.
    5. RAG Solution – While renowned LLM (e.g. ChatGPT) is good at understanding all the public domain concepts and knowledge at the time the model was trained, they cannot understand the concepts which are under specific knowledge domain. For example, if your business invented a new product name “aldis lds” , the ChatGPT will not recognize it as a product of your company. RAG is to orchestrate the knowledge of the real world, as well as the specific knowledge you provided before it gives you a search outcome. Please understand that while the business operation or business data may change everyday, the cost of “fine-tune” the LLM every day is simply too time consuming.
    6. GraphRAG – While the RAG which is based on Vector is good in similarity search, if you have zero fault tolerance and want a 100% precise search result which the underlying know-how knowledge domain which is probably only acquainted by yourself (e.g. as a Cloud Architect Consultant). You hope that you can provide some of your know-how in 100% precision to the system by manual input, and let LLM find out the result to the user based on your personal know-how and the understanding of the knowledge in the public domain. Graph Database perform better than Vector Database in terms of hallucination-free.
    7. Adaptive GraphRAG – In old days we learnt from finding the answer. In the era of AI, we learnt by starting at forming a good question. While most of the time the user doesn’t even know what they are asking or searching for. For example, in an interior design consultation meeting, when the client expresses that they want a “japanese style bedroom”, before the designer gives them the answer , he/she will most probably ask the client “what is your budget” or “is it Ancient Japan or contemporary Japan” . You can realize that the question should be “adaptive” (i.e. keep optimising and adjusting) before the useful question is formed. An answer from an meaningless question is expected to be meaningless.

    In conclusion, the GraphRAG SaaS Enterprise Knowledge Graph We Application is a solution backed by Enumeration, Indexing and Search functions which can help any individual or organisation to save time on Production , Searching , Error Handling and Communication cost.


    Real World Scenario

    In order to visualize the power of the GraphRAG Enterprise Knowledge Graph, allow me to demonstrate with a real-world day to day example in digital marketing world.

    While Customer Service Chatbot is for sure one of the powerful aspects of saving time cost, I want to put the focus on another more important point which can be bought by the GraphRAG solution. Therefore I will keep the Customer Service level Chatbot description minimal.

    Besides, i will also skip all the description regarding some automation in programmatic (i.e. not AI) level. For example, Email auto forwarding with hard coded conditional logic based on the Email Title via Email API whenever an new Email received.

    Background

    A Individual Client , John, who owned a WordPress website created by us (DDM Group). He received the Spam Contact Us Form Email daily, which he made him feel annoyed. As we (DDM Group) is John’ website adminstrator, he complained to us.


    Trigger – Symptom

    Although John received the email because of the Spam bot of the Contact Us Form Submission in his website, he does not realize the fact and his complaint email is as below:

    Hi DDM,

    My email keep receiving rubblish Email daily. Please help to fix.

    In most of the time, the client or end-user , like John, can only use human daily language, instead of technical jargon , to describe the problem they faced.

    And most important is that, the event which trigger the action (e.g. write a complaint email) is normally come from a Symptom which drive his emotion (e.g. Fear , Annoying , Despair). Most of the time this Symptom is not the cause of the problem and instead is the consequence by itself.

    For easy communication, we named this “Trigger” as Symptom.

    Symptom = Rubblish Email

    Party Involved = Client


    Problem Pattern

    By asking John to submit the Rubblish Email to the Google Drive, the Technical Support analyzed that the Email is infact triggered by the Contact Us Form Submission in the existing Website.

    And therefore, the Technical Support classifed it as a “Spam Form Submission” Problem Pattern which was already reported by different client many times and therefore is named and indexed as “Spam Form Submission Problem Pattern in our system

    Problem Pattern = Spam Form Submission

    Party Involved = Technical Support


    Solution and Environment

    As stated before, the Spam Form Submission is a well-knowned Problem Pattern , as an experienced website administrator, DDM Group had already indexed and mapped different kinds of Solution for different scenario with the same Problem Pattern.

    Following factors affecting the choice of the Solutions:

    1. Client Contract Amount
      • VIP Client
      • Standard Client
    2. SMTP Sending Server
      • GMAIL API
      • SMTP Sending Server provided by Client itself
    3. Web Server
      • Proxy Server – Cloudflare

    In order to identify the Client Contract Amount , Web Server as well as the SMTP Sending Server specific to John’s case, the Technical Support and the Customer Service Officer have to access the CRM , as well as Website Development Production Database to lookup the Client Contract Amount , applied SMTP Sending Server and Web Server.

    After lookup, we figureed out that John is a VIP Client and using GMAIL API and Cloudflare.

    The Technical Support, based on his years of experienced and know-how in cyber security knowledge domain , realized that the main reason of the Submission Contact Us Form being spammed is due to the fact that some kinds of Spam Form Bot constantly crawled John’s website and realized the website is using some popular open-source plugin which triggered vulnerability exposure, leading the Spam Form Bot can easily fill in the form in John’s website automatically. In order to stop being spammed , the best way which the Technical Support can think of is to let the Spam Form Bot cannot even reach John’s website. And hence the Solution of Server Level WAF (Firewall) installation is chosen due to the fact that the Cloudflare Proxy Server supports WAF Firewall.

    Environment = VIP Client , GMAIL API, Cloudflare

    Party Involved = CRM Manager + Techncial Support

    Solution = Server Level Firewall (WAF)

    Party Involved = Technial Support


    Deliverable (SKU) and SKU Feature

    Once the Solution is confirmed, the case is passed to the Account Manager (i.e. Salesperson) to follow up and explain to the client.

    While the Technical Support does not quite familar with the SKU Name in the SKU Library, he suggested to the Account Manager to visit the SKU Library in DDM Group and search for search term “Cloudflare WAF”

    The SKU Library come out with the following SKU#

    SKU NameSKU#
    Cloudflare WAF – Standard5232323
    Cloudflare WAF – Premium5232345
    Wordfence (WordPress Firewall)8475623

    Due to the fact that the SKU name by itself cannot faciliate the decision on which SKU to be chosen to solve the problem, the Technical Team further dives into the SKU Feature of the 2 Cloudflare related SKU and realized that only Cloudflare WAF – Premium (#5232345) supports the Legitimate Bot whitelisting feature.

    SKU = Cloudflare WAF – Premium

    SKU Feature = Legitimate Bot Whitelisting

    Party Involved = Account Manager


    Target Audience Properties and Sales Trigger

    As an seasoned and proactive Account Manager, he realized that it is a good opportunity to upsell another SKU to John due to the fact that the Spam Submission Form alerted him for the cyber security concern.

    The Account Manager googled the knowledge and figured out that Login Attempt Attack (i.e. a Problem Pattern) is another common vulnerability which is suffered by lots of eshop like what John is running.

    The Account Manager , based on his experience, believed that Fear is a good sales trigger to have the intention purchase. In this sense, he told the potential risk of being login attempt attack by the malicious bot and suggested John to install another 2FA plugin which can effectively protect the unauthorized login.

    As the Account Manager that John have no idea on what a Login Attempt Attack is , he visualized the problem pattern by showing the visiting report which logged thousands of visits of the login page of John’s eshop with an hour.

    John felt worry about it and took the advice and purchased the SKU of 2FA Plugin Installation for WordPress, while the Account Manager successfully upsell a SKU related to John case.

    Target Audience Property = Eshop owner

    Sales Trigger = Fear

    SKU = 2FA Plugin Installation for WordPress

    Problem Pattern = Login Attempt Attack

    Sympton = Thousand of visits in Login Page in an hour

    Party Involved = Account Manager + Client


    Plugin for Production

    Once John signs the Sales Contract, the Sales Contract with the involved SKUs is passed to the Production Manager.

    While the Sales Contract enumerated the SKU name , it does not limit which plugin to use in order to deliver the SKU.

    Having checked with the Plugin Library regarding the error and bug reports for each plugin, the Production Manager decided to use the plugin WordFence for the 2FA related SKU and Cloudflare for the Server WAF related SKU.

    SKU = Cloudflare WAF – Premium

    Plugin = WordFence

    SKU = 2FA Plugin Installation for WordPress

    Plugin = Cloudflare


    Putting Everything Together

    When you put everything together, you may realize in fact you are doing the following steps:

    1. Enumerating and indexing all the factors (i.e. Column Name) observed from the real world , AND
    2. Enumerating and indexing all the option values for each factor
      • e.g. Fear / Hope / Greed in Sales Trigger Column
    3. Map the Option Value among each 2 columns under a Bipartite Data Pattern.
    4. Searching based on the need of different roles
      • e.g. As a Client or Account Manager role, search by inserting a value in any of the column (e.g. 1,000 login page visited in an hour in Symptom Column)
    5. Output the result in different columns based on different role.
      • As a Production Manager, refer to the SKU and suggested the related Plugin Name.

    In the real business world, there are thousands of factors (i.e. columns) that can be addressed, with each factors may have thousands of option value involved (e.g. a Sales Order Records), forming a infinity number of nodes and edges of a Graph, which can be only comprehensively memorized and handed by machine.


    Conclusion

    I hope you can understand the problem pattern involved in the real world and realise that the learning activity of a human being is in fact based on enumerating , indexing , mapping and searching. 

    By applying the GraphRAG Enterprise Knowledge Graph SaaS Web App (i.e. bGraph), it can automate and speed up the learning of a human being based on following open-source technical stack:

    1. Retrieve the Data via
      • Web Scrapper for Public Domain Knowledge
      • APIs for Public Domain Knowledge (e.g. Weather Condition)
      • APIs For Private Domain Knowledge (e.g. in-house CRM)
      • Domain Specific Know-how provided manually by in-house expert
      • Meta Data (e.g. Data Schema , Business Logic) in different data silo (e.g. CRM or POS) from Data Lake
    2. Text Embedding the retrieved Data into Vector Database
    3. Entity Extraction from the retrieved Data and store in Graph Database
    4. LangChain to orchestrate multi AI models (e.g. Image / Text / Voice)
    5. LLMs (e.g. ChatGPT) to comprehend the content stored in Vector or Graph Database
    6. Adaptive RAG Function to
      • Retrieve the Search Query from the Client
      • Refine their query to useful question
      • Retrieved the data from Step#1
      • Comprehend the Data
    7. Semantic Search Engine (Search Bar or Chat Bubble) to allow user to insert their Search Query in
      • Plain English
      • Not precise wording
    8. Visualize the Output via Graph Database and Graph Data Science Library to solve the following problems:
      • Shortest Click Path between 2 concepts
      • Centrality
      • Community Detection
    9. Output the result via a Chat Bubble by Streamlit.

  • Assign Youtube Studio Access Rigths to Others

    Assign Youtube Studio Access Rigths to Others

    Definition


    Google Ads

    Google Ads is an online advertising platform developed by Google, where advertisers can create ads to promote their products, services, or content. These ads can appear across Google’s vast network, including the Google Search results, YouTube, Gmail, and various websites within the Google Display Network.

    Google Ads , Google Marketing Platform and Google Adsense are 3 separate Google services with different functions event though they are all related to placing ads via Google.

    We will focus on Google Ads in this article.


    Access Rights

    Access rights refer to the Role and Capabilities of a specific login name can access the application (i.e. Google Ads in this case). In some cases, the access rights will not only be assigned to a human , but also another system which want to access the application.

    For example, the e-shop platform Woocommerce may want to access the Google Merchant Center so that the Woocommerce can upload the product feed to Google Merchant Center.

    Unless otherwise stated, we assumed the Access Rights is assigned to human instead of another system. 


    When to assign Access Rights to others

    Keep secret to the Root Access of the Google Ads account

    Instead of sharing the Root Access to others, i.e. the login and password of the Gmail account which you used to registered for the Google Ads account, you can instead only share different levels of Access Rights of Google Ads account.

    Access Rights Permission Level does matter

    If you want to share the Read-Only Access Rights instead of Admin Access Rights which can configure anything inside the Google Ads account, you should consider the permission level of the Access Rights

    Employment or Agency Turnover

    Whenever a staff or an digital marketing agency is quit, if you don’t want to change all the passwords the he/she possessed for the Google Ads account, you can in the beginning simply assign him/her different Permission level of Access Rights , instead of giving him/her the Root Access of the Google Ads account.


    Prerequisite of Assigning Google Ads Access Rights

    As a Assignor

    1. Ready for login of the Gmail account which is granted Administrative Access Rights of the Google Ads account. This is not as easy as it seems because most of the time , due to the employee turnover, the organisation may have so many Gmail account that the current marketer have no ideas which Gmail account is used for logging in the Google Ads account.
    2. Assignee Gmail Address
    3. Decide which Google Ads account to Assign
      • Usually you may have more than 1 Google Ads Accounts which some are active while some are expired or no longer used. Please make sure that you assign the valid and active one.
      • If you want to check which Google Ads account you are currently in use and Checking Existing Google Tracking Code in a Website

    Step by Step on Assigning Google Ads Rights to others

    As a Assignor

    1. ads.google.com > <<ASSIGNOR_GMAIL_ADDRESS>>
    2. Admin  > Access and security
    3. Email= <<ASSIGNEE_GMAIL_ADDRESS>>
    4. Access expires = Never
    5. Select account access level= Admin1
    6. Send Invitation

    As a Assignee

    1. gmail.com
    2. Inbox
    3. from = [email protected]
    4. Email Title = Accept your invitation to access a Google Ads account Inbox
    1. ACCEPT INVITATION
    1. CONTINUE
    2. ads.google.com > <<ASSIGNEE_GMAIL_ADDRESS>>
    3. Now you (Assignee) should be able to see the Google Ads assigned to you.

    1. For details description of the capabilities of the Access Rights Level, please visit https://support.google.com/google-ads/answer/9978556?hl=en ↩︎
  • Assign Google Tag Manager Access Rigths to Others

    Assign Google Tag Manager Access Rigths to Others

    Definition


    Google Tag Manager

    Google Tag Manager (GTM) is a free tag management system that allows you to manage and deploy marketing tags (small snippets of code) on your website or mobile app without modifying the underlying code. It simplifies the process of adding and updating tags, such as those for Google Analytics, Google Ads, or third-party tools, through an intuitive web interface.


    Access Rights

    Access rights refer to the Role and Capabilities of a specific login name can access the application (i.e. Google Tag Manager in this case). In some cases, the access rights will not only be assigned to a human , but also another system which want to access the application.

    For example, the e-shop platform Woocommerce may want to access the Google Merchant Center so that the Woocommerce can upload the product feed to Google Merchant Center.

    Unless otherwise stated, we assumed the Access Rights is assigned to human instead of another system. 


    When to assign Access Rights to others

    Keep secret to the Root Access of the Google Ads account

    Instead of sharing the Root Access to others, i.e. the login and password of the Gmail account which you used to registered for the Google Ads account, you can instead only share different levels of Access Rights of Google Ads account.

    Access Rights Permission Level does matter

    If you want to share the Read-Only Access Rights instead of Admin Access Rights which can configure anything inside the Google Tag Manager account, you should consider the permission level of the Access Rights

    Employment or Agency Turnover

    Whenever a staff or an digital marketing agency is quit, if you don’t want to change all the passwords the he/she possessed for the Google Tag Manager (GTM) account, you can in the beginning simply assign him/her different Permission level of Access Rights , instead of giving him/her the Root Access of the Google Tag Manager account.


    Prerequisite of Assigning Google Ads Access Rights

    As a Assignor

    1. Ready for login of the Gmail account which is granted Administrative Access Rights of the Google Ads account. This is not as easy as it seems because most of the time , due to the employee turnover, the organisation may have so many Gmail account that the current marketer have no ideas which Gmail account is used for logging in the Google Ads account.
    2. Assignee GMAIL Address
    3. Decide which Google Tag Manager Account to Assign
      • Usually you may have more than 1 Google Tag Manager Accounts which some are active while some are expired or no longer used because each digital marketing agency you had appointed propbably had installed their own GTM Tag in your website. Please make sure that you assign the valid and active one to the assignee.
    4. Chrome Extension Tag Assistant Installed in the Chrome Browser
      • If you want to check which Google Tag had been installed in your website, you can install run the Chrome Extension Tag Assistant and visit your website by the Chrome Browser after you have installed. Bear in mind that the GTM Tag found in your website may not probably the one that you are in use. You have to use the Tag Assistant to trigger and run the Tag one by one.
    5. Decide the permission level to assign
      • Account Level Permissions – These permissions control access to the overall GTM account:
        • User
        • Administrator (suggested)
      • Container-Level Permissions: These permissions are specific to individual containers within the GTM account:
        • Read
        • Edit
        • Approve
        • Publish (suggested)

    Step by Step on Assigning Google Tag Manager Rights to others

    As a Assignor

    Assign Account Permission

    1. tagmanager.google.com/ > <<ASSIGNOR_GMAIL_ADDRESS>>
    2. Accounts = <<TARGET_ACCOUNT>>
    3. Container ID = <<TARGET_CONTAINER_ID>>
    4. Admin  > User Management
    5. Account permissions
    6. +
    7. Add users
    8. Email addresses = <<ASSIGNEE_GMAIL>>
    9. Account permissions = Administrator

    Assign Container Permission

    1. Container permissions
    2. Publish > Done
    3. Invitation

    As a Assignee

    1. gmail.com
    2. Inbox
    3. from = [email protected]
    4. Email Title = Accept your invitation to access a Google Ads account Inbox
    1. Open invitation in Google Tag Manager

Diamond Digital Marketing Group