From f76fc6a89dead724a44ba7b530ca9e2fe2dd22df Mon Sep 17 00:00:00 2001 From: Aland Date: Tue, 3 Oct 2023 16:01:59 -0300 Subject: [PATCH 01/50] Update README.md with Aland's answers and codes --- README.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/README.md b/README.md index 5d075b9..7368fe4 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,79 @@ Task 2 & 3 - Friday 6th Oct. 5pm (AEST) Note: you only need to commit the notebook, and you do not need to provide a backup of the database + +## Answers for Task 1 💻 +1.1 - Data into the db + +The JSON file after unzip has a size of app 4.8 GB. The file cannot be directly load into memory or by JSON even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way to load the data by chunks in the Neo4j DB (Desktop version 5.3.0) and using Python 🐍 for geting the chunks of JSON and to populate the DB. + +The file **test1_json2.ipynb** shows an example of a Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. + +For each element in the JSON file, i.e., for each paper, the following procedures in Cypher are + +To create the nodes for PAPERS: + + CALL apoc.load.json("file:///paps/paper_1.json") + YIELD value + WITH value.author AS author + RETURN author + +To create the nodes for ORGANISATIONS: + + CALL apoc.load.json("file:///paps/paper_1.json") + YIELD value + WITH value.author AS authors + UNWIND authors AS au + UNWIND au.affiliation as affiliation + MERGE (o:ORGANISATION {name: affiliation.name}) + RETURN o + +To create the nodes for AUTHORS and the relationships with PAPERS and ORGANISATIONS: + + CALL apoc.load.json("file:///paps/paper_1.json") + YIELD value + WITH value.author AS authors, value.id as code + UNWIND authors AS au + UNWIND au.affiliation as affiliation + MERGE (a:AUTHOR {name: COALESCE(au.given ,"") + ',' + COALESCE(au.family ,"")}) ON CREATE SET a.given = au.given, a.family = au.family, a.affiliation = affiliation.name + MERGE (p:PAPER {name: code}) + MERGE (o:ORGANISATION {name: affiliation.name}) + MERGE (p)-[:WRITTEN_BY]->(a) + MERGE (a)-[:IS_PART_OF]->(o) + RETURN a, p, o + +To iterate this procedures, the Jupyter notebook **ResearchGraph4Neo4j2.ipynb** shows the Python 🐍 code where each query is built to be iterable through the small JSON files. +All the steps are done for all the generated JSON files. + +(*) Note: To make the code easy to use (and less precise), some problems caused by differences in fields between JSON elements (articles) where avoided just by skip them. For instance, some articles don't have authors information, and some authors don't have affiliation information or have a different format of affiliation (id instead of name). This issues could be addressed by a more comprehensive criteria when building the queries and using some logic to detect the differences in structures from the JSON. + +1.2 - Computing the values 🧮 + +Once the data is all in the Graph db, we can create a query to get the number of nodes per each label. The following is an example query to get the counts. + + MATCH (a:AUTHOR) + WITH count(a) AS count + RETURN 'Author' AS label, count + UNION ALL + MATCH (o:ORGANISATION) + WITH count(o) AS count + RETURN 'Organisation' AS label, count + UNION ALL + MATCH (p:PAPER) + WITH count(p) AS count + RETURN 'Paper' AS label, count + +The resulting values are in the following table + + label: count + "Author": 16342 + "Organisation": 10820 + "Paper": 15612 + +(*) Note: The original number of articles (papers, conferences journals, chapters, etc) is 501629. However, some of them were ignored due to the presence of problems in some fields. +This could be solved with a more tailored approach to consider ALL the posibilities in terms of fields, according to predefined criterias. + + ## Task 2 2.1 - Calculate the following measures in this data * Top 10 organisations with the highest degree of centrality From 626d95fbc67d0335366af53ec2d4c146c41dbaf0 Mon Sep 17 00:00:00 2001 From: Aland Date: Tue, 3 Oct 2023 16:02:48 -0300 Subject: [PATCH 02/50] add jupyter notebooks with Python code --- ResearchGraph4Neo4j2.ipynb | 323 +++++++++++++++++++++++++++++++++++++ test1_json2.ipynb | 93 +++++++++++ 2 files changed, 416 insertions(+) create mode 100644 ResearchGraph4Neo4j2.ipynb create mode 100644 test1_json2.ipynb diff --git a/ResearchGraph4Neo4j2.ipynb b/ResearchGraph4Neo4j2.ipynb new file mode 100644 index 0000000..0c321cf --- /dev/null +++ b/ResearchGraph4Neo4j2.ipynb @@ -0,0 +1,323 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "16895a8c-c3a2-42bd-b14c-9c8b740278ba", + "metadata": {}, + "source": [ + "# Research Graph - Papers Graph database example\n", + "Load json data from file in Neo4j using apoc procedure.\n", + "\n", + "Aland Astudillo - 2023-10-03" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "89c53981-131e-428e-9eaf-774bc868c470", + "metadata": {}, + "outputs": [], + "source": [ + "from neo4j import GraphDatabase\n", + "\n", + "driver = GraphDatabase.driver(uri=\"bolt://localhost:7687\", auth=(\"neo4j\", \"clavecita\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "bdbd7d70-1d70-4a88-a8c4-aabc6ebf7595", + "metadata": {}, + "outputs": [], + "source": [ + "session = driver.session()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4b206a89-3224-4399-85c9-a557c9d088cf", + "metadata": {}, + "outputs": [], + "source": [ + "query_paper = \"\"\"\n", + "CALL apoc.load.json(\"file:///paps/paper_3.json\")\n", + "YIELD value\n", + "WITH value\n", + "MERGE (paper:PAPER {name: value.doi, code: value.id, doi: value.doi, url: value.url})\n", + "RETURN paper\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "fd59c2b5-dfd5-40a7-83af-b94782964ee4", + "metadata": {}, + "outputs": [], + "source": [ + "results = session.run(query_paper)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "43149582-dba7-4657-b78a-87d7762057af", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'paper': {'code': '10.1142/s0218213019400086',\n", + " 'name': '10.1142/s0218213019400086',\n", + " 'url': 'http://dx.doi.org/10.1142/s0218213019400086',\n", + " 'doi': '10.1142/s0218213019400086'}}]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e902de69-79be-4456-bc09-02d14a5b5747", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 5114, File: CALL apoc.load.json(\"file:///paps/paper_5114.json\")\r" + ] + } + ], + "source": [ + "# testing iteration for queries\n", + "niter = 501629 #2000\n", + "\n", + "for i in range(niter):\n", + " # add paper\n", + " query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value\n", + " MERGE (paper:PAPER {name: value.doi, code: value.id, doi: value.doi, url: value.url})\n", + " RETURN paper\n", + " \"\"\"\n", + " query_paper = query_p1 + query_p2\n", + " results = session.run(query_paper)\n", + " #results.data()\n", + "\n", + " #check if author is \"no\"\n", + " query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value.author AS author\n", + " RETURN author\n", + " \"\"\"\n", + " query_paper = query_p1 + query_p2\n", + " results = session.run(query_paper)\n", + " data = results.data()\n", + " di = data[0]\n", + " if di['author']=='no':\n", + " continue\n", + " \n", + " # add organisations\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value.author AS authors\n", + " UNWIND authors AS au\n", + " UNWIND au.affiliation as affiliation\n", + " MERGE (o:ORGANISATION {name: affiliation.name})\n", + " RETURN o\n", + " \"\"\"\n", + " query_organisation = query_p1 + query_p2\n", + " try:\n", + " results = session.run(query_organisation) # organisations without name are skiped (organisation.name =null)\n", + " pass\n", + " except:\n", + " # Continue to next iteration.\n", + " continue\n", + " \n", + " # add authors\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value.author AS authors, value.id as code\n", + " UNWIND authors AS au\n", + " UNWIND au.affiliation as affiliation\n", + " MERGE (a:AUTHOR {name: COALESCE(au.given ,\"\") + ',' + COALESCE(au.family ,\"\")}) ON CREATE SET a.given = au.given, a.family = au.family, a.affiliation = affiliation.name \n", + " MERGE (p:PAPER {name: code})\n", + " MERGE (o:ORGANISATION {name: affiliation.name})\n", + " MERGE (p)-[:WRITTEN_BY]->(a)\n", + " MERGE (a)-[:IS_PART_OF]->(o)\n", + " RETURN a, p, o\n", + " \"\"\"\n", + " query_authors = query_p1 + query_p2\n", + " \n", + " try:\n", + " results = session.run(query_authors) # authors when organisation without name are skiped (organisation.name =null)\n", + " pass\n", + " except:\n", + " # Continue to next iteration.\n", + " continue\n", + " \n", + " print('Iteration ' + str(i+1) + ', File: ' + query_p1, end='\\r')" + ] + }, + { + "cell_type": "markdown", + "id": "222e710e-8735-425a-8e4f-6512de121689", + "metadata": {}, + "source": [ + "# testing how to check if an author is a \"NO\" (some papers don't show authors)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "f9bf74ea-d81f-42c4-910b-1ab08250a4db", + "metadata": {}, + "outputs": [], + "source": [ + "i = 1006 # consider that i : 1006 corresponds to file 1007 % CHECK with i = 1005" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "7fb1fc9a-83d6-454a-8969-8ad43340fb8e", + "metadata": {}, + "outputs": [], + "source": [ + "query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", + "query_p2 = \"\"\"\n", + "YIELD value\n", + "WITH value.author AS author\n", + "RETURN author\n", + "\"\"\"\n", + "query_paper = query_p1 + query_p2\n", + "results = session.run(query_paper)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "8d625187-bab5-4340-9476-6aeef0574484", + "metadata": {}, + "outputs": [], + "source": [ + "data = results.data()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "00c63d4c-0b8a-4400-9e93-0c8174743ebe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'author': 'no'}]" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "66eec2b3-191e-42b7-80a4-2d6c47330947", + "metadata": {}, + "outputs": [], + "source": [ + "di = data[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "8b5bf4fc-b07c-4de7-8642-c58e3a4a02c7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'no'" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "di['author']" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "3686fa65-cda9-465c-a71f-2a98531123f4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "di['author']=='no'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de7b839b-1e30-405a-8181-37c0b1a2f917", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/test1_json2.ipynb b/test1_json2.ipynb new file mode 100644 index 0000000..1859fd1 --- /dev/null +++ b/test1_json2.ipynb @@ -0,0 +1,93 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Save a bunch of files from a json" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import ijson\n", + "import json\n", + "\n", + "path_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", + "file_name = 'artificial_intelligence.json'\n", + "output_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", + "\n", + "user_to_repos = {}\n", + "contador = 0\n", + "#limite = 10\n", + "\n", + "with open(path_name+file_name, \"rb\") as f:\n", + " for record in ijson.items(f, \"item\"):\n", + " print('converting file n ' + str(contador+1)) \n", + "\n", + " id = record[\"_id\"]\n", + " url = record[\"URL\"]\n", + " if 'author' in record:\n", + " author = record[\"author\"]\n", + " else:\n", + " author = 'no'\n", + "\n", + " doi = record[\"DOI\"]\n", + " ref_count = record['reference-count'] #: 0,\n", + " if ref_count>0:\n", + " ref = record[\"reference\"]\n", + " else:\n", + " ref = 'no'\n", + "\n", + " new_record = {'id': id, 'url': url, 'author': author, 'doi': doi, 'ref': ref}\n", + "\n", + " #record.to_json(path_name+'chunk_{}.json'.format(i))\n", + " with open(path_name+'paper_{}.json'.format(contador+1), \"w\") as fp:\n", + " json.dump(new_record , fp, indent=4) \n", + "\n", + " #user = record[\"actor\"][\"login\"]\n", + " #repo = record[\"repo\"][\"name\"]\n", + " #if user not in user_to_repos:\n", + " # user_to_repos[user] = set()\n", + " #user_to_repos[user].add(repo)\n", + "\n", + " contador = contador + 1\n", + " #if contador==limite:\n", + " # break" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "record" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From a7b515061709dbad33737d0cd7b790845a9095b0 Mon Sep 17 00:00:00 2001 From: Aland Date: Tue, 3 Oct 2023 16:05:57 -0300 Subject: [PATCH 03/50] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7368fe4..526eb17 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Note: you only need to commit the notebook, and you do not need to provide a bac ## Answers for Task 1 💻 1.1 - Data into the db -The JSON file after unzip has a size of app 4.8 GB. The file cannot be directly load into memory or by JSON even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way to load the data by chunks in the Neo4j DB (Desktop version 5.3.0) and using Python 🐍 for geting the chunks of JSON and to populate the DB. +The JSON file after unzip has a size of app 4.8 GB. The file cannot be directly load into memory or by JSON even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way to load the data by chunks in the Neo4j DB (Desktop version 5.3.0) and using Python 🐍 for geting the chunks of JSON and to populate the DB. The file **test1_json2.ipynb** shows an example of a Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. @@ -71,6 +71,8 @@ All the steps are done for all the generated JSON files. (*) Note: To make the code easy to use (and less precise), some problems caused by differences in fields between JSON elements (articles) where avoided just by skip them. For instance, some articles don't have authors information, and some authors don't have affiliation information or have a different format of affiliation (id instead of name). This issues could be addressed by a more comprehensive criteria when building the queries and using some logic to detect the differences in structures from the JSON. +(**) Note: Another option is to use the apoc.periodic.iterate method, however, it didn't work. + 1.2 - Computing the values 🧮 Once the data is all in the Graph db, we can create a query to get the number of nodes per each label. The following is an example query to get the counts. From e06ba2a2bfafea688b93bab4efd972deae9ee2e5 Mon Sep 17 00:00:00 2001 From: Aland Date: Tue, 3 Oct 2023 23:45:52 -0300 Subject: [PATCH 04/50] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 526eb17..34ea77c 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,15 @@ Note: you only need to commit the notebook, and you do not need to provide a bac ## Answers for Task 1 💻 1.1 - Data into the db +In order to load the data in Neo4j, it was neccesary to manipulate the original JSON file and explore it using Python. + +Activities +- Manipulate the big JSON to check the most suitable way to get chunks of data +- Get small files with chunks of data using Python script +- Create a db in Neo4j using Neo4j Desktop +- Create the queries to populate the Graph db +- Iterate through the queries via Python and Neo4j Python package + The JSON file after unzip has a size of app 4.8 GB. The file cannot be directly load into memory or by JSON even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way to load the data by chunks in the Neo4j DB (Desktop version 5.3.0) and using Python 🐍 for geting the chunks of JSON and to populate the DB. The file **test1_json2.ipynb** shows an example of a Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. From 81d010519c013fa7bc65718d230d86c3e63d7554 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:05:19 -0300 Subject: [PATCH 05/50] Update README.md --- README.md | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 34ea77c..aa72392 100644 --- a/README.md +++ b/README.md @@ -37,12 +37,22 @@ Activities - Create a db in Neo4j using Neo4j Desktop - Create the queries to populate the Graph db - Iterate through the queries via Python and Neo4j Python package +- Populate and create the nodes for AUTHORS, PAPERS and ORGANISATIONS +- create the relationships PAPER -[WRITTEN_BY]-> AUTHOR & AUTHOR -[IS_PART_OF]-> ORGANISATION -The JSON file after unzip has a size of app 4.8 GB. The file cannot be directly load into memory or by JSON even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way to load the data by chunks in the Neo4j DB (Desktop version 5.3.0) and using Python 🐍 for geting the chunks of JSON and to populate the DB. +The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python 🐍 to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. -The file **test1_json2.ipynb** shows an example of a Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. +The file **Transform_BIG_JSON.ipynb** shows the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. -For each element in the JSON file, i.e., for each paper, the following procedures in Cypher are +It was considered to get 3 types of nodes: +- AUTHOR +- PAPER +- ORGANISATION +and 2 types of relationships: +- WRITTEN_BY: PAPER -[WRITTEN_BY]-> AUTHOR +- IS_PART_OF: AUTHOR -[IS_PART_OF]-> ORGANISATION + +In the case of 1 item (article) per JSON the reading and creation of nodes is done. For each JSON file ( eg. paper_1.json), i.e., for each article, the following procedures were performed using Cypher: To create the nodes for PAPERS: @@ -75,16 +85,15 @@ To create the nodes for AUTHORS and the relationships with PAPERS and ORGANISATI MERGE (a)-[:IS_PART_OF]->(o) RETURN a, p, o -To iterate this procedures, the Jupyter notebook **ResearchGraph4Neo4j2.ipynb** shows the Python 🐍 code where each query is built to be iterable through the small JSON files. -All the steps are done for all the generated JSON files. +The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of first name and lastname, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook **ResearchGraph4Neo4j3.ipynb** shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. -(*) Note: To make the code easy to use (and less precise), some problems caused by differences in fields between JSON elements (articles) where avoided just by skip them. For instance, some articles don't have authors information, and some authors don't have affiliation information or have a different format of affiliation (id instead of name). This issues could be addressed by a more comprehensive criteria when building the queries and using some logic to detect the differences in structures from the JSON. +(*) Note: To make the code easy to use (and less precise), some issues caused by differences in fields between JSON elements (articles) were avoided just by skipping them. For instance, some articles don't have authors' information, and some authors don't have affiliation's information or they have a different format for the affiliation (eg. 'id' instead of 'name'). This issues could be addressed by a more comprehensive criteria when building the queries and using some better logic to detect the differences in structures from the JSON. -(**) Note: Another option is to use the apoc.periodic.iterate method, however, it didn't work. +(**) Note: Another option to load a BIG JSON in an iteratively way is to use the apoc.periodic.iterate method, however, it didn't work in my local 1.2 - Computing the values 🧮 -Once the data is all in the Graph db, we can create a query to get the number of nodes per each label. The following is an example query to get the counts. +Once the data is all in the Graph db, we can create a query to get the number of nodes per each label. The following is an example query to get the counts: MATCH (a:AUTHOR) WITH count(a) AS count @@ -98,14 +107,21 @@ Once the data is all in the Graph db, we can create a query to get the number of WITH count(p) AS count RETURN 'Paper' AS label, count -The resulting values are in the following table +Using the iterative method to populate the graph db, because the low optimal approach used here, the process was able to get just 168116 records from a total of 501629 records.The resulting values are in the following table + + label count + "Author" 60346 + "Organisation" 41253 + "Paper" 167650 + +Knowing that these are not the total values, I double check the values using a Python Script to analise the BIG JSON file and obtain the unique values for PAPERS (id: id or doi), AUTHORS (id: given name + family name) and ORGANISATIONS (id: name). The script is called **explore_JSON.ipynb** and the resulting values are: - label: count - "Author": 16342 - "Organisation": 10820 - "Paper": 15612 + TOTAL RECORDS: 501629 + UNIQUE AUTHORS: 736857 + UNIQUE ORGANISATIONS: 150375 + UNIQUE PAPERS: 501629 -(*) Note: The original number of articles (papers, conferences journals, chapters, etc) is 501629. However, some of them were ignored due to the presence of problems in some fields. +(*) Note: The original number of articles (papers, conferences journals, chapters, etc) is 501629. However, some of them were ignored due to the presence of problems in some fields. For instance, in some cases, inside the field **authors** some records have the affiliation as an author, which was avoided by reviewing the properties of each author in the for loops. This could be solved with a more tailored approach to consider ALL the posibilities in terms of fields, according to predefined criterias. From 3e62bb6fbda579fc8c5e1fb6f938309bd675f06a Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:09:28 -0300 Subject: [PATCH 06/50] add new updated files --- ResearchGraph4Neo4j3.ipynb | 197 ++++++++++++++++++ Transform_BIG_JSON.ipynb | 96 +++++++++ example_papers_graph.png | Bin 0 -> 107197 bytes explore_JSON.ipynb | 401 +++++++++++++++++++++++++++++++++++++ 4 files changed, 694 insertions(+) create mode 100644 ResearchGraph4Neo4j3.ipynb create mode 100644 Transform_BIG_JSON.ipynb create mode 100644 example_papers_graph.png create mode 100644 explore_JSON.ipynb diff --git a/ResearchGraph4Neo4j3.ipynb b/ResearchGraph4Neo4j3.ipynb new file mode 100644 index 0000000..7d98fbb --- /dev/null +++ b/ResearchGraph4Neo4j3.ipynb @@ -0,0 +1,197 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "16895a8c-c3a2-42bd-b14c-9c8b740278ba", + "metadata": {}, + "source": [ + "# Research Graph - Papers Graph database example\n", + "Load json data from files and populate in the Neo4j graph db using apoc procedure.\n", + "\n", + "Aland Astudillo - 2023-10-03" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "89c53981-131e-428e-9eaf-774bc868c470", + "metadata": {}, + "outputs": [], + "source": [ + "from neo4j import GraphDatabase\n", + "\n", + "driver = GraphDatabase.driver(uri=\"bolt://localhost:7687\", auth=(\"neo4j\", \"clavecita\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "bdbd7d70-1d70-4a88-a8c4-aabc6ebf7595", + "metadata": {}, + "outputs": [], + "source": [ + "session = driver.session()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "4b206a89-3224-4399-85c9-a557c9d088cf", + "metadata": {}, + "outputs": [], + "source": [ + "query_paper = \"\"\"\n", + "CALL apoc.load.json(\"file:///paps/paper_3.json\")\n", + "YIELD value\n", + "WITH value\n", + "MERGE (paper:PAPER {name: value.doi, code: value.id, doi: value.doi, url: value.url})\n", + "RETURN paper\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "fd59c2b5-dfd5-40a7-83af-b94782964ee4", + "metadata": {}, + "outputs": [], + "source": [ + "results = session.run(query_paper)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "43149582-dba7-4657-b78a-87d7762057af", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'paper': {'code': '10.1142/s0218213019400086',\n", + " 'name': '10.1142/s0218213019400086',\n", + " 'url': 'http://dx.doi.org/10.1142/s0218213019400086',\n", + " 'doi': '10.1142/s0218213019400086'}}]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e902de69-79be-4456-bc09-02d14a5b5747", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 163159, File: CALL apoc.load.json(\"file:///paps/paper_163159.json\")\r" + ] + } + ], + "source": [ + "# testing iteration for queries\n", + "niter = 501629 #2000\n", + "\n", + "for i in range(niter):\n", + " # add paper\n", + " query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value\n", + " MERGE (paper:PAPER {name: value.doi, code: value.id, doi: value.doi, url: value.url})\n", + " RETURN paper\n", + " \"\"\"\n", + " query_paper = query_p1 + query_p2\n", + " results = session.run(query_paper)\n", + " #results.data()\n", + "\n", + " #check if author is \"no\"\n", + " query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value.author AS author\n", + " RETURN author\n", + " \"\"\"\n", + " query_paper = query_p1 + query_p2\n", + " results = session.run(query_paper)\n", + " data = results.data()\n", + " di = data[0]\n", + " if di['author']=='no':\n", + " continue\n", + " \n", + " # add organisations\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value.author AS authors\n", + " UNWIND authors AS au\n", + " UNWIND au.affiliation as affiliation\n", + " MERGE (o:ORGANISATION {name: affiliation.name})\n", + " RETURN o\n", + " \"\"\"\n", + " query_organisation = query_p1 + query_p2\n", + " try:\n", + " results = session.run(query_organisation) # organisations without name are skiped (organisation.name =null)\n", + " pass\n", + " except:\n", + " # Continue to next iteration.\n", + " continue\n", + " \n", + " # add authors\n", + " query_p2 = \"\"\"\n", + " YIELD value\n", + " WITH value.author AS authors, value.id as code\n", + " UNWIND authors AS au\n", + " UNWIND au.affiliation as affiliation\n", + " MERGE (a:AUTHOR {name: COALESCE(au.given ,\"\") + ',' + COALESCE(au.family ,\"\")}) ON CREATE SET a.given = au.given, a.family = au.family, a.affiliation = affiliation.name \n", + " MERGE (p:PAPER {name: code})\n", + " MERGE (o:ORGANISATION {name: affiliation.name})\n", + " MERGE (p)-[:WRITTEN_BY]->(a)\n", + " MERGE (a)-[:IS_PART_OF]->(o)\n", + " RETURN a, p, o\n", + " \"\"\"\n", + " query_authors = query_p1 + query_p2\n", + " \n", + " try:\n", + " results = session.run(query_authors) # authors when organisation without name are skiped (organisation.name =null)\n", + " pass\n", + " except:\n", + " # Continue to next iteration.\n", + " continue\n", + " \n", + " print('Iteration ' + str(i+1) + ', File: ' + query_p1, end='\\r')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Transform_BIG_JSON.ipynb b/Transform_BIG_JSON.ipynb new file mode 100644 index 0000000..c28098e --- /dev/null +++ b/Transform_BIG_JSON.ipynb @@ -0,0 +1,96 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transform BIG JSON\n", + "Load a BIG JSON iteratively via ijson (lazy) and save a bunch of JSON files.\n", + "\n", + "Aland Astudillo 2023-10-04" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import ijson\n", + "import json\n", + "\n", + "path_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", + "file_name = 'artificial_intelligence.json'\n", + "output_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", + "\n", + "user_to_repos = {}\n", + "contador = 0\n", + "#limite = 10\n", + "\n", + "with open(path_name+file_name, \"rb\") as f:\n", + " for record in ijson.items(f, \"item\"):\n", + " print('converting file n ' + str(contador+1)) \n", + "\n", + " id = record[\"_id\"]\n", + " url = record[\"URL\"]\n", + " if 'author' in record:\n", + " author = record[\"author\"]\n", + " else:\n", + " author = 'no'\n", + "\n", + " doi = record[\"DOI\"]\n", + " ref_count = record['reference-count'] #: 0,\n", + " if ref_count>0:\n", + " ref = record[\"reference\"]\n", + " else:\n", + " ref = 'no'\n", + "\n", + " new_record = {'id': id, 'url': url, 'author': author, 'doi': doi, 'ref': ref}\n", + "\n", + " #record.to_json(path_name+'chunk_{}.json'.format(i))\n", + " with open(path_name+'paper_{}.json'.format(contador+1), \"w\") as fp:\n", + " json.dump(new_record , fp, indent=4) \n", + "\n", + " #user = record[\"actor\"][\"login\"]\n", + " #repo = record[\"repo\"][\"name\"]\n", + " #if user not in user_to_repos:\n", + " # user_to_repos[user] = set()\n", + " #user_to_repos[user].add(repo)\n", + "\n", + " contador = contador + 1\n", + " #if contador==limite:\n", + " # break" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "record" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/example_papers_graph.png b/example_papers_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd0a1bf02381431edd55f483ff28098c4df269d GIT binary patch literal 107197 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 CzH_hu literal 0 HcmV?d00001 diff --git a/explore_JSON.ipynb b/explore_JSON.ipynb new file mode 100644 index 0000000..cd31993 --- /dev/null +++ b/explore_JSON.ipynb @@ -0,0 +1,401 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Get Articles, Authors and organisations from the JSON file\n", + "Load the big JSON file in a lazy way\n", + "iterate through the records\n", + "restructure each record and get key values\n", + "\n", + "Aland Astudillo - 2023-10-04" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 501629, File: 10.12681/eadd/40861 .52263 .242270 t27-3589-11 3 energy-transition rgy-transition es-uniquely-and-functionally-connected-to-the-initiation-and-progression-of-diseases \r" + ] + } + ], + "source": [ + "import ijson\n", + "import json\n", + "import numpy as np\n", + "\n", + "path_name = 'C:\\\\zAland\\\\researchgraph_challenge\\\\'\n", + "file_name = 'artificial_intelligence.json'\n", + "\n", + "contador = 0\n", + "limite = 10\n", + "uselimite = False # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>v CHANGE THIS LINE TO LIMIT THE ITERATIONS THROUGH ELEMENTS\n", + "\n", + "authorList = []\n", + "organisationList = []\n", + "authorOrganisationList = []\n", + "paperList = []\n", + "\n", + "with open(path_name + file_name, \"rb\") as f:\n", + " for record in ijson.items(f, \"item\"):\n", + " id = record[\"_id\"]\n", + " paperList.append(id)\n", + " \n", + " url = record[\"URL\"]\n", + " doi = record[\"DOI\"]\n", + "\n", + " #print('loading record n ' + str(contador+1)) \n", + " print('Iteration ' + str(contador+1) + ', File: ' + id + ' ', end='\\r')\n", + " \n", + " if 'author' in record:\n", + " author = record[\"author\"]\n", + " ifAuthor = True\n", + " else:\n", + " author = 'no'\n", + " ifAuthor = False\n", + " \n", + " ref_count = record['reference-count'] #: 0,\n", + " if ref_count>0:\n", + " ref = record[\"reference\"]\n", + " else:\n", + " ref = 'no'\n", + "\n", + " new_record = {'id': id, 'url': url, 'author': author, 'doi': doi} #, 'ref': ref}\n", + " \n", + " nAuthors = len(author)\n", + " if ifAuthor:\n", + " affiliationList = []\n", + " for i in range(nAuthors):\n", + " authorItem = author[i]\n", + " if 'given' in authorItem:\n", + " authorName = authorItem['given']\n", + " else:\n", + " continue\n", + "\n", + " \n", + " authorLastName = authorItem['family']\n", + "\n", + " if 'affiliation' in authorItem:\n", + " affiliation = authorItem['affiliation']\n", + " if len(affiliation)>0:\n", + " affiliationItem = affiliation[0]\n", + " ifAffiliation = True\n", + " \n", + " if 'name' in affiliationItem:\n", + " affiliationName = affiliationItem['name']\n", + " ifAffiliationName = True\n", + " else:\n", + " affiliationName = 'no'\n", + " ifAffiliationName = False\n", + " else:\n", + " affiliationName = 'no'\n", + " ifAffiliationName = False\n", + " else:\n", + " affiliationName = 'no'\n", + " ifAffiliation = False\n", + "\n", + " \n", + " authorCompleteName = authorName + ' ' + authorLastName\n", + " authorList.append(authorCompleteName)\n", + " \n", + " affiliationList.append(affiliationName)\n", + " item = [authorCompleteName, affiliationName]\n", + " authorOrganisationList.append(item)\n", + "\n", + " \n", + " affiliationArray = np.array(affiliationList)\n", + " affiliationArrayUnique = np.unique(affiliationArray)\n", + " affiliationList = affiliationArrayUnique.tolist()\n", + " \n", + " organisationList = organisationList + affiliationList\n", + " \n", + "\n", + " contador = contador + 1\n", + " \n", + " if uselimite:\n", + " if contador==limite:\n", + " break\n", + "\n", + " \n", + "# last element\n", + "# Iteration 501629, File: 10.12681/eadd/408611.522631.242270ht27-3589-116253/energy-transitionergy-transitionres-uniquely-and-functionally-connected-to-the-initiation-and-progression-of-diseases" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[['MUHAMMAD ROZI MALIM',\n", + " 'Faculty of Computer and Mathematical Sciences, MARA University of Technology, Shah Alam, 40450 Selangor, Malaysia'],\n", + " ['FARIDAH ABDUL HALIM',\n", + " 'Faculty of Computer and Mathematical Sciences, MARA University of Technology, Shah Alam, 40450 Selangor, Malaysia'],\n", + " ['JUAN PERALTA DONATE',\n", + " 'Computer Science Department, Carlos III University, Av Universidad 30, Leganes, Madrid 28911, Spain'],\n", + " ['GERMAN GUTIERREZ SANCHEZ',\n", + " 'Computer Science Department, Carlos III University, Av Universidad 30, Leganes, Madrid 28911, Spain'],\n", + " ['ARACELI SANCHIS DE MIGUEL',\n", + " 'Computer Science Department, Carlos III University, Av Universidad 30, Leganes, Madrid 28911, Spain'],\n", + " ['Dionisios N. Sotiropoulos',\n", + " 'Department of Computer Science, University of Piraeus, 80, M. Karaoli & A. Dimitriou St., 18534 Piraeus, Greece'],\n", + " ['Efthimios Alepis',\n", + " 'Department of Computer Science, University of Piraeus, 80, M. Karaoli & A. Dimitriou St., 18534 Piraeus, Greece'],\n", + " ['Katerina Kabassi',\n", + " 'Department of Environment, Ionian University, Technological Educational Institute of Ionian, Islands Panagoula, 29100 Zakynthos, Greece'],\n", + " ['Maria K. Virvou',\n", + " 'Department of Computer Science, University of Piraeus, 80, M. Karaoli & A. Dimitriou St., 18534 Piraeus, Greece'],\n", + " ['George A. Tsihrintzis',\n", + " 'Department of Computer Science, University of Piraeus, 80, M. Karaoli & A. Dimitriou St., 18534 Piraeus, Greece']]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "authorOrganisationList[0:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Faculty of Computer and Mathematical Sciences, MARA University of Technology, Shah Alam, 40450 Selangor, Malaysia',\n", + " 'Computer Science Department, Carlos III University, Av Universidad 30, Leganes, Madrid 28911, Spain',\n", + " 'Department of Computer Science, University of Piraeus, 80, M. Karaoli & A. Dimitriou St., 18534 Piraeus, Greece',\n", + " 'Department of Environment, Ionian University, Technological Educational Institute of Ionian, Islands Panagoula, 29100 Zakynthos, Greece',\n", + " 'aDeNu Research Group, Artificial Intelligence Department, Computer Science School, UNED, Calle Juan del Rosal, 16 Madrid 28040, Spain',\n", + " 'Department of Computer Engineering, Islamic Azad University, Najafabad Branch, Isfahan, Iran',\n", + " 'Department of Industrial Engineering, Yazd University, Saffayieh, Yazd, Iran',\n", + " 'Department of Management, Islamic Azad University, Central Tehran Branch, Tehran, Iran',\n", + " 'Department of Technology Management, Iran University of Science and Technology, Tehran, Iran',\n", + " 'Faculty of Industrial Engineering, Islamic Azad University, Firoozkooh Branch, Tehran, Iran']" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "organisationList[0:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['MUHAMMAD ROZI MALIM',\n", + " 'FARIDAH ABDUL HALIM',\n", + " 'JUAN PERALTA DONATE',\n", + " 'GERMAN GUTIERREZ SANCHEZ',\n", + " 'ARACELI SANCHIS DE MIGUEL',\n", + " 'Dionisios N. Sotiropoulos',\n", + " 'Efthimios Alepis',\n", + " 'Katerina Kabassi',\n", + " 'Maria K. Virvou',\n", + " 'George A. Tsihrintzis']" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "authorList[0:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "authorArray = np.array(authorList)\n", + "authorArrayUnique = np.unique(authorArray)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1517750,)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "authorArray.shape # (1517750,)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(736857,)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "authorArrayUnique.shape # (736857,)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "organisationArray = np.array(organisationList)\n", + "organisationArrayUnique = np.unique(organisationArray)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(556799,)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "organisationArray.shape # (556799,)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(150375,)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "organisationArrayUnique.shape #(150375,)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# papers paperList\n", + "paperArray = np.array(paperList)\n", + "paperArrayUnique = np.unique(paperArray)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(501629,)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "paperArray.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(501629,)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "paperArrayUnique.shape" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 24b9307861839ff47db2fa3155cc65550e96a38e Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:09:59 -0300 Subject: [PATCH 07/50] Delete ResearchGraph4Neo4j2.ipynb --- ResearchGraph4Neo4j2.ipynb | 323 ------------------------------------- 1 file changed, 323 deletions(-) delete mode 100644 ResearchGraph4Neo4j2.ipynb diff --git a/ResearchGraph4Neo4j2.ipynb b/ResearchGraph4Neo4j2.ipynb deleted file mode 100644 index 0c321cf..0000000 --- a/ResearchGraph4Neo4j2.ipynb +++ /dev/null @@ -1,323 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "16895a8c-c3a2-42bd-b14c-9c8b740278ba", - "metadata": {}, - "source": [ - "# Research Graph - Papers Graph database example\n", - "Load json data from file in Neo4j using apoc procedure.\n", - "\n", - "Aland Astudillo - 2023-10-03" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "89c53981-131e-428e-9eaf-774bc868c470", - "metadata": {}, - "outputs": [], - "source": [ - "from neo4j import GraphDatabase\n", - "\n", - "driver = GraphDatabase.driver(uri=\"bolt://localhost:7687\", auth=(\"neo4j\", \"clavecita\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "bdbd7d70-1d70-4a88-a8c4-aabc6ebf7595", - "metadata": {}, - "outputs": [], - "source": [ - "session = driver.session()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "4b206a89-3224-4399-85c9-a557c9d088cf", - "metadata": {}, - "outputs": [], - "source": [ - "query_paper = \"\"\"\n", - "CALL apoc.load.json(\"file:///paps/paper_3.json\")\n", - "YIELD value\n", - "WITH value\n", - "MERGE (paper:PAPER {name: value.doi, code: value.id, doi: value.doi, url: value.url})\n", - "RETURN paper\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "fd59c2b5-dfd5-40a7-83af-b94782964ee4", - "metadata": {}, - "outputs": [], - "source": [ - "results = session.run(query_paper)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "43149582-dba7-4657-b78a-87d7762057af", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'paper': {'code': '10.1142/s0218213019400086',\n", - " 'name': '10.1142/s0218213019400086',\n", - " 'url': 'http://dx.doi.org/10.1142/s0218213019400086',\n", - " 'doi': '10.1142/s0218213019400086'}}]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.data()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e902de69-79be-4456-bc09-02d14a5b5747", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Iteration 5114, File: CALL apoc.load.json(\"file:///paps/paper_5114.json\")\r" - ] - } - ], - "source": [ - "# testing iteration for queries\n", - "niter = 501629 #2000\n", - "\n", - "for i in range(niter):\n", - " # add paper\n", - " query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", - " query_p2 = \"\"\"\n", - " YIELD value\n", - " WITH value\n", - " MERGE (paper:PAPER {name: value.doi, code: value.id, doi: value.doi, url: value.url})\n", - " RETURN paper\n", - " \"\"\"\n", - " query_paper = query_p1 + query_p2\n", - " results = session.run(query_paper)\n", - " #results.data()\n", - "\n", - " #check if author is \"no\"\n", - " query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", - " query_p2 = \"\"\"\n", - " YIELD value\n", - " WITH value.author AS author\n", - " RETURN author\n", - " \"\"\"\n", - " query_paper = query_p1 + query_p2\n", - " results = session.run(query_paper)\n", - " data = results.data()\n", - " di = data[0]\n", - " if di['author']=='no':\n", - " continue\n", - " \n", - " # add organisations\n", - " query_p2 = \"\"\"\n", - " YIELD value\n", - " WITH value.author AS authors\n", - " UNWIND authors AS au\n", - " UNWIND au.affiliation as affiliation\n", - " MERGE (o:ORGANISATION {name: affiliation.name})\n", - " RETURN o\n", - " \"\"\"\n", - " query_organisation = query_p1 + query_p2\n", - " try:\n", - " results = session.run(query_organisation) # organisations without name are skiped (organisation.name =null)\n", - " pass\n", - " except:\n", - " # Continue to next iteration.\n", - " continue\n", - " \n", - " # add authors\n", - " query_p2 = \"\"\"\n", - " YIELD value\n", - " WITH value.author AS authors, value.id as code\n", - " UNWIND authors AS au\n", - " UNWIND au.affiliation as affiliation\n", - " MERGE (a:AUTHOR {name: COALESCE(au.given ,\"\") + ',' + COALESCE(au.family ,\"\")}) ON CREATE SET a.given = au.given, a.family = au.family, a.affiliation = affiliation.name \n", - " MERGE (p:PAPER {name: code})\n", - " MERGE (o:ORGANISATION {name: affiliation.name})\n", - " MERGE (p)-[:WRITTEN_BY]->(a)\n", - " MERGE (a)-[:IS_PART_OF]->(o)\n", - " RETURN a, p, o\n", - " \"\"\"\n", - " query_authors = query_p1 + query_p2\n", - " \n", - " try:\n", - " results = session.run(query_authors) # authors when organisation without name are skiped (organisation.name =null)\n", - " pass\n", - " except:\n", - " # Continue to next iteration.\n", - " continue\n", - " \n", - " print('Iteration ' + str(i+1) + ', File: ' + query_p1, end='\\r')" - ] - }, - { - "cell_type": "markdown", - "id": "222e710e-8735-425a-8e4f-6512de121689", - "metadata": {}, - "source": [ - "# testing how to check if an author is a \"NO\" (some papers don't show authors)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "f9bf74ea-d81f-42c4-910b-1ab08250a4db", - "metadata": {}, - "outputs": [], - "source": [ - "i = 1006 # consider that i : 1006 corresponds to file 1007 % CHECK with i = 1005" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "7fb1fc9a-83d6-454a-8969-8ad43340fb8e", - "metadata": {}, - "outputs": [], - "source": [ - "query_p1 = 'CALL apoc.load.json(\"file:///paps/paper_{}.json\")'.format(i+1)\n", - "query_p2 = \"\"\"\n", - "YIELD value\n", - "WITH value.author AS author\n", - "RETURN author\n", - "\"\"\"\n", - "query_paper = query_p1 + query_p2\n", - "results = session.run(query_paper)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "8d625187-bab5-4340-9476-6aeef0574484", - "metadata": {}, - "outputs": [], - "source": [ - "data = results.data()" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "00c63d4c-0b8a-4400-9e93-0c8174743ebe", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'author': 'no'}]" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "66eec2b3-191e-42b7-80a4-2d6c47330947", - "metadata": {}, - "outputs": [], - "source": [ - "di = data[0]" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "8b5bf4fc-b07c-4de7-8642-c58e3a4a02c7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'no'" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "di['author']" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "3686fa65-cda9-465c-a71f-2a98531123f4", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "di['author']=='no'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "de7b839b-1e30-405a-8181-37c0b1a2f917", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From a6e3b34e6a6043a82a7dd6f2ba15c96eb99db8f1 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:10:21 -0300 Subject: [PATCH 08/50] Delete test1_json2.ipynb --- test1_json2.ipynb | 93 ----------------------------------------------- 1 file changed, 93 deletions(-) delete mode 100644 test1_json2.ipynb diff --git a/test1_json2.ipynb b/test1_json2.ipynb deleted file mode 100644 index 1859fd1..0000000 --- a/test1_json2.ipynb +++ /dev/null @@ -1,93 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Save a bunch of files from a json" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import ijson\n", - "import json\n", - "\n", - "path_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", - "file_name = 'artificial_intelligence.json'\n", - "output_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", - "\n", - "user_to_repos = {}\n", - "contador = 0\n", - "#limite = 10\n", - "\n", - "with open(path_name+file_name, \"rb\") as f:\n", - " for record in ijson.items(f, \"item\"):\n", - " print('converting file n ' + str(contador+1)) \n", - "\n", - " id = record[\"_id\"]\n", - " url = record[\"URL\"]\n", - " if 'author' in record:\n", - " author = record[\"author\"]\n", - " else:\n", - " author = 'no'\n", - "\n", - " doi = record[\"DOI\"]\n", - " ref_count = record['reference-count'] #: 0,\n", - " if ref_count>0:\n", - " ref = record[\"reference\"]\n", - " else:\n", - " ref = 'no'\n", - "\n", - " new_record = {'id': id, 'url': url, 'author': author, 'doi': doi, 'ref': ref}\n", - "\n", - " #record.to_json(path_name+'chunk_{}.json'.format(i))\n", - " with open(path_name+'paper_{}.json'.format(contador+1), \"w\") as fp:\n", - " json.dump(new_record , fp, indent=4) \n", - "\n", - " #user = record[\"actor\"][\"login\"]\n", - " #repo = record[\"repo\"][\"name\"]\n", - " #if user not in user_to_repos:\n", - " # user_to_repos[user] = set()\n", - " #user_to_repos[user].add(repo)\n", - "\n", - " contador = contador + 1\n", - " #if contador==limite:\n", - " # break" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "record" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From a48ea6740f4cc1a45f3446a2c71da38a11b2e805 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:12:23 -0300 Subject: [PATCH 09/50] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index aa72392..05c54ac 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,8 @@ To create the nodes for AUTHORS and the relationships with PAPERS and ORGANISATI The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of first name and lastname, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook **ResearchGraph4Neo4j3.ipynb** shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. +Alt text + (*) Note: To make the code easy to use (and less precise), some issues caused by differences in fields between JSON elements (articles) were avoided just by skipping them. For instance, some articles don't have authors' information, and some authors don't have affiliation's information or they have a different format for the affiliation (eg. 'id' instead of 'name'). This issues could be addressed by a more comprehensive criteria when building the queries and using some better logic to detect the differences in structures from the JSON. (**) Note: Another option to load a BIG JSON in an iteratively way is to use the apoc.periodic.iterate method, however, it didn't work in my local From 4e95ea47e93cf6ae75a59e622dd4d2cd619abaf4 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:13:22 -0300 Subject: [PATCH 10/50] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 05c54ac..6cd1f15 100644 --- a/README.md +++ b/README.md @@ -85,13 +85,13 @@ To create the nodes for AUTHORS and the relationships with PAPERS and ORGANISATI MERGE (a)-[:IS_PART_OF]->(o) RETURN a, p, o -The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of first name and lastname, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook **ResearchGraph4Neo4j3.ipynb** shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. +The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of first name and lastname, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook **ResearchGraph4Neo4j3.ipynb** shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. The image shows part of the nodes created in the graph db. Alt text (*) Note: To make the code easy to use (and less precise), some issues caused by differences in fields between JSON elements (articles) were avoided just by skipping them. For instance, some articles don't have authors' information, and some authors don't have affiliation's information or they have a different format for the affiliation (eg. 'id' instead of 'name'). This issues could be addressed by a more comprehensive criteria when building the queries and using some better logic to detect the differences in structures from the JSON. -(**) Note: Another option to load a BIG JSON in an iteratively way is to use the apoc.periodic.iterate method, however, it didn't work in my local +(**) Note: Another option to load a BIG JSON in an iteratively way is to use the apoc.periodic.iterate method, however, it didn't work in my local. 1.2 - Computing the values 🧮 From 5aeb8371d9c753029bb26785e20924dd60643b55 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:19:39 -0300 Subject: [PATCH 11/50] Update README.md --- README.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6cd1f15..0625b2d 100644 --- a/README.md +++ b/README.md @@ -29,16 +29,17 @@ Note: you only need to commit the notebook, and you do not need to provide a bac ## Answers for Task 1 💻 1.1 - Data into the db -In order to load the data in Neo4j, it was neccesary to manipulate the original JSON file and explore it using Python. +In order to load the data in Neo4j, it was neccesary to manipulate the original JSON file, explore it using Python, and then find the way to push it into the Neo4j. The following list of activities show an overview of the performed steps: Activities - Manipulate the big JSON to check the most suitable way to get chunks of data - Get small files with chunks of data using Python script - Create a db in Neo4j using Neo4j Desktop - Create the queries to populate the Graph db +- Generate a Python code to connect to the graph db and perform the queries - Iterate through the queries via Python and Neo4j Python package -- Populate and create the nodes for AUTHORS, PAPERS and ORGANISATIONS -- create the relationships PAPER -[WRITTEN_BY]-> AUTHOR & AUTHOR -[IS_PART_OF]-> ORGANISATION +- Populate and create the nodes for **AUTHORS**, **PAPERS**, and **ORGANISATIONS** +- create the relationships **PAPER -[WRITTEN_BY]-> AUTHOR** & **AUTHOR -[IS_PART_OF]-> ORGANISATION** The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python 🐍 to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. @@ -85,7 +86,7 @@ To create the nodes for AUTHORS and the relationships with PAPERS and ORGANISATI MERGE (a)-[:IS_PART_OF]->(o) RETURN a, p, o -The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of first name and lastname, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook **ResearchGraph4Neo4j3.ipynb** shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. The image shows part of the nodes created in the graph db. +The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of given name and family name, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook **ResearchGraph4Neo4j3.ipynb** shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. The image shows part of the nodes created in the graph db. Alt text @@ -95,7 +96,7 @@ The identifier for PAPERS were the id of each JSON element, for AUTHORS the iden 1.2 - Computing the values 🧮 -Once the data is all in the Graph db, we can create a query to get the number of nodes per each label. The following is an example query to get the counts: +Once the data is all in the Graph db, we can create a query to get the number of nodes per each label. The following is an example query to get the counts for each type of node: MATCH (a:AUTHOR) WITH count(a) AS count @@ -109,13 +110,19 @@ Once the data is all in the Graph db, we can create a query to get the number of WITH count(p) AS count RETURN 'Paper' AS label, count -Using the iterative method to populate the graph db, because the low optimal approach used here, the process was able to get just 168116 records from a total of 501629 records.The resulting values are in the following table +Using the iterative method to populate the graph db, because the low optimal approach used here, the process was able to get just 168116 records from a total of 501629 records in my local machine. The resulting values are in the following table label count "Author" 60346 "Organisation" 41253 "Paper" 167650 +| label | count | +|---------------|--------| +| Authors | 60346 | +| Organisations | 41253 | +| Papers | 167650 | + Knowing that these are not the total values, I double check the values using a Python Script to analise the BIG JSON file and obtain the unique values for PAPERS (id: id or doi), AUTHORS (id: given name + family name) and ORGANISATIONS (id: name). The script is called **explore_JSON.ipynb** and the resulting values are: TOTAL RECORDS: 501629 From e74c8fe16bcd9f1b6674db538acf69e28ed1c63b Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:22:43 -0300 Subject: [PATCH 12/50] Update README.md --- README.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0625b2d..fa86b44 100644 --- a/README.md +++ b/README.md @@ -112,11 +112,6 @@ Once the data is all in the Graph db, we can create a query to get the number of Using the iterative method to populate the graph db, because the low optimal approach used here, the process was able to get just 168116 records from a total of 501629 records in my local machine. The resulting values are in the following table - label count - "Author" 60346 - "Organisation" 41253 - "Paper" 167650 - | label | count | |---------------|--------| | Authors | 60346 | @@ -125,14 +120,18 @@ Using the iterative method to populate the graph db, because the low optimal app Knowing that these are not the total values, I double check the values using a Python Script to analise the BIG JSON file and obtain the unique values for PAPERS (id: id or doi), AUTHORS (id: given name + family name) and ORGANISATIONS (id: name). The script is called **explore_JSON.ipynb** and the resulting values are: - TOTAL RECORDS: 501629 - UNIQUE AUTHORS: 736857 - UNIQUE ORGANISATIONS: 150375 - UNIQUE PAPERS: 501629 +| ITEM | COUNT | +|----------------------|--------| +| TOTAL RECORDS | 501629 | +| UNIQUE AUTHORS | 736857 | +| UNIQUE ORGANISATIONS | 150375 | +| UNIQUE PAPERS | 501629 | (*) Note: The original number of articles (papers, conferences journals, chapters, etc) is 501629. However, some of them were ignored due to the presence of problems in some fields. For instance, in some cases, inside the field **authors** some records have the affiliation as an author, which was avoided by reviewing the properties of each author in the for loops. This could be solved with a more tailored approach to consider ALL the posibilities in terms of fields, according to predefined criterias. +For more details about construction of queries, resources, references, examples, and additional information, please, review the document **neo4j_examples.txt**. + ## Task 2 2.1 - Calculate the following measures in this data From 2f5b27c3ea8a7764d3f28485854032150f5d8c22 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:25:44 -0300 Subject: [PATCH 13/50] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fa86b44..9e0e782 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Activities The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python 🐍 to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. -The file **Transform_BIG_JSON.ipynb** shows the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. +The file **Transform_BIG_JSON.ipynb** [here](/Transform_BIG_JSON.ipynb) shows the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. It was considered to get 3 types of nodes: - AUTHOR @@ -53,7 +53,7 @@ and 2 types of relationships: - WRITTEN_BY: PAPER -[WRITTEN_BY]-> AUTHOR - IS_PART_OF: AUTHOR -[IS_PART_OF]-> ORGANISATION -In the case of 1 item (article) per JSON the reading and creation of nodes is done. For each JSON file ( eg. paper_1.json), i.e., for each article, the following procedures were performed using Cypher: +In the case of 1 item (article) per JSON the reading and creation of nodes is done. For each JSON file (eg. paper_1.json), i.e., for each article, the following procedures were performed using Cypher: To create the nodes for PAPERS: From 44d703e2cb71e94b84378e3b91c31a36228e1eab Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:26:12 -0300 Subject: [PATCH 14/50] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e0e782..66a0688 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Activities The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python 🐍 to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. -The file **Transform_BIG_JSON.ipynb** [here](/Transform_BIG_JSON.ipynb) shows the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. +The file [**Transform_BIG_JSON.ipynb**](/Transform_BIG_JSON.ipynb) shows the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. It was considered to get 3 types of nodes: - AUTHOR From daf3c0a4ed5ef93236d6b87d497f5330cd4df218 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:26:53 -0300 Subject: [PATCH 15/50] file with additional details, information, resources --- neo4j_examples.txt | 467 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 467 insertions(+) create mode 100644 neo4j_examples.txt diff --git a/neo4j_examples.txt b/neo4j_examples.txt new file mode 100644 index 0000000..d91f930 --- /dev/null +++ b/neo4j_examples.txt @@ -0,0 +1,467 @@ +CHALLENGE https://researchgraph.org/ + +# Neo4j Desktop Activation Key +Use this key to activate your copy of Neo4j Desktop for use. +eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6IndlYi10ZXN0QG5lbzRqLmNvbSIsIm1peHBhbmVsSWQiOiIkZGV2aWNlOjE4YWMwZmE2ZjNlOTAzLTAyZTA1MzdhMjBkYzQ2LTI2MDMxZjUxLTEwMDIwMC0xOGFjMGZhNmYzZTkwMyIsIm1peHBhbmVsUHJvamVjdElkIjoiNGJmYjI0MTRhYjk3M2M3NDFiNmYwNjdiZjA2ZDU1NzUiLCJvcmciOiJOZW80aiIsInB1YiI6Im5lbzRqLmNvbSIsInJlZyI6IlRlc3QgTmVvNGoiLCJzdWIiOiJuZW80ai1kZXNrdG9wIiwiZXhwIjoxNzI3MDc3MTg0LCJ2ZXIiOiIqIiwiaXNzIjoibmVvNGouY29tIiwibmJmIjoxNjk1NDU0Nzg0LCJpYXQiOjE2OTU0NTQ3ODQsImp0aSI6ImFvN25xUmV4eiJ9.niy4OdaJAOlh6GEaHxct_mbGwfWDYsV8q9r9ZogOWfMrbnkBJxtnqHJ205xHzXGayZ5fNmsR1MCh9HbiafT33F5PIaxc-oA5BcsebK70z1hwEHP4ckbJQi5nhO48a3EvoObCtXEqHKF1SMsAuH6tCmq1RtufXG5xSlYLQggV61mY0hwalqKIt6b0DqyIHlA-TUMaIgTeh_kfDqopc97VnUGe6OJ3PAVAN2ZIwg3RojGA6bp4_znzR-M0C6VMUloGktKopiWMP__IP9QSma7v3bb3VEJCDrANnbjH6TxhKObgdmgAvPGvH2aKuHjnvgrrirD81kT-yy_HgaO1T3GX-A + + +# EXAMPLE NBA GRAPH DB +CREATE +(russell:PLAYER{name:"Russell Westbrook", age: 33, number: 0, height: 1.91, weight: 91}), +(lebron:PLAYER{name:"LeBron James", age: 36, number: 6, height: 2.06, weight: 113}), +(anthony:PLAYER{name:"Anthony Davis", age: 28, number: 23, height: 2.08, weight: 115}), +(ja:PLAYER{name:"Ja Morant", age: 22, number: 12, height: 1.91, weight: 79}), +(luka:PLAYER{name:"Luka Doncic", age: 22, number: 77, height: 2.01, weight: 104}), +(kristaps:PLAYER{name:"Kristaps Porzingis", age: 26, number: 6, height: 2.21, weight: 109}), +(kevin:PLAYER{name:"Kevin Durant", age: 33, number: 7, height: 2.08, weight: 109}), +(james:PLAYER{name:"James Harden", age: 32, number: 13, height: 1.96, weight: 100}), +(giannis:PLAYER{name:"Giannis Antetokounmpo", age: 26, number: 34, height: 2.11, weight: 110}), +(khris:PLAYER{name:"Khris Middleton", age: 30, number: 22, height: 2.01, weight: 100}), +(joel:PLAYER{name:"Joel Embiid", age: 27, number: 21, height: 2.13, weight: 127}), +(tobias:PLAYER{name:"Tobias Harris", age: 29, number: 22, height: 2.03, weight: 100}), + +(frank:COACH{name: "Frank Vogel"}), +(taylor:COACH{name: "Taylor Jenkins"}), +(jason:COACH{name: "Jason Kidd"}), +(steve:COACH{name: "Steve Nash"}), +(mike:COACH{name: "Mike Budenholzer"}), +(doc:COACH{name: "Doc Rivers"}), +(stan:COACH{name: "Stan Van Gundy"}), + +(lakers:TEAM{name:"LA Lakers"}), +(memphis:TEAM{name:"Memphis Grizzlies"}), +(mavericks:TEAM{name:"Dallas Mavericks"}), +(nets:TEAM{name:"Brooklyn Nets"}), +(bucks:TEAM{name:"Milwaukee Bucks"}), +(sixers:TEAM{name:"Philadelphia 76ers"}), + +(lebron)-[:TEAMMATES]-> (russell), +(lebron)<-[:TEAMMATES]- (russell), +(lebron)-[:TEAMMATES]-> (anthony), +(lebron)<-[:TEAMMATES]- (anthony), +(russell)-[:TEAMMATES]-> (anthony), +(russell)<-[:TEAMMATES]- (anthony), +(luka)-[:TEAMMATES]-> (kristaps), +(luka)<-[:TEAMMATES]- (kristaps), +(kevin)-[:TEAMMATES]-> (james), +(kevin)<-[:TEAMMATES]- (james), +(giannis)-[:TEAMMATES]-> (khris), +(giannis)<-[:TEAMMATES]- (khris), +(joel)-[:TEAMMATES]-> (tobias), +(joel)<-[:TEAMMATES]- (tobias), + +(frank)-[:COACHES]->(lebron), +(frank)-[:COACHES]->(anthony), +(frank)-[:COACHES]->(russell), +(taylor)-[:COACHES]->(ja), +(jason)-[:COACHES]->(luka), +(jason)-[:COACHES]->(kristaps), +(steve)-[:COACHES]->(kevin), +(steve)-[:COACHES]->(james), +(mike)-[:COACHES]->(giannis), +(mike)-[:COACHES]->(khris), +(doc)-[:COACHES]->(tobias), +(doc)-[:COACHES]->(joel), + +(lebron)-[:PLAYS_FOR {salary: 40000000}]-> (lakers), +(russell)-[:PLAYS_FOR {salary: 33000000}]-> (lakers), +(anthony)-[:PLAYS_FOR {salary: 38000000}]-> (lakers), +(ja)-[:PLAYS_FOR {salary: 8000000}]-> (memphis), +(luka)-[:PLAYS_FOR {salary: 50000000}]-> (mavericks), +(kristaps)-[:PLAYS_FOR {salary: 26000000}]-> (mavericks), +(kevin)-[:PLAYS_FOR {salary: 45000000}]-> (nets), +(james)-[:PLAYS_FOR{salary: 4200000}]-> (nets), +(giannis)-[:PLAYS_FOR {salary: 47000000}]-> (bucks), +(khris)-[:PLAYS_FOR {salary: 43000000}]-> (bucks), +(joel)-[:PLAYS_FOR {salary: 4000000}]-> (sixers), +(tobias)-[:PLAYS_FOR {salary: 4000000}]-> (sixers), + +(frank)-[:COACHES_FOR]->(lakers), +(taylor)-[:COACHES_FOR]->(memphis), +(jason)-[:COACHES_FOR]->(mavericks), +(steve)-[:COACHES_FOR]->(nets), +(mike)-[:COACHES_FOR]->(bucks), +(doc)-[:COACHES_FOR]->(sixers), + + +(lebron)-[:PLAYED_AGAINST {minutes: 38, points: 32, assists: 6, rebounds: 6, turnovers: 2}]-> (memphis), +(russell)-[:PLAYED_AGAINST {minutes: 29, points: 16, assists: 12, rebounds: 11, turnovers: 16}]-> (memphis), +(anthony)-[:PLAYED_AGAINST {minutes: 36, points: 27, assists: 2, rebounds: 8, turnovers: 1}]-> (memphis), +(ja)-[:PLAYED_AGAINST {minutes: 43, points: 42, assists: 7, rebounds: 8, turnovers: 4}]-> (lakers), + +(lebron)-[:PLAYED_AGAINST {minutes: 23, points: 25, assists: 12, rebounds: 3, turnovers: 0}]-> (memphis), +(russell)-[:PLAYED_AGAINST {minutes: 20, points: 11, assists: 10, rebounds: 3, turnovers: 8}]-> (memphis), +(anthony)-[:PLAYED_AGAINST {minutes: 30, points: 22, assists: 2, rebounds: 8, turnovers: 1}]-> (memphis), +(ja)-[:PLAYED_AGAINST {minutes: 35, points: 35, assists: 3, rebounds: 4, turnovers: 2}]-> (lakers), + +(lebron)-[:PLAYED_AGAINST {minutes: 32, points: 18, assists: 3, rebounds: 6, turnovers: 1}]-> (nets), +(russell)-[:PLAYED_AGAINST {minutes: 26, points: 26, assists: 11, rebounds: 13, turnovers: 6}]-> (nets), +(anthony)-[:PLAYED_AGAINST {minutes: 30, points: 26, assists: 7, rebounds: 18, turnovers: 3}]-> (nets), +(kevin)-[:PLAYED_AGAINST {minutes: 43, points: 45, assists: 5, rebounds: 8, turnovers: 2}]-> (lakers), +(james)-[:PLAYED_AGAINST {minutes: 46, points: 35, assists: 13, rebounds: 4, turnovers: 7}]-> (lakers), + +(kevin)-[:PLAYED_AGAINST {minutes: 34, points: 37, assists: 2, rebounds: 12, turnovers: 1}]-> (memphis), +(james)-[:PLAYED_AGAINST {minutes: 46, points: 35, assists: 13, rebounds: 4, turnovers: 7}]-> (memphis), +(ja)-[:PLAYED_AGAINST {minutes: 26, points: 32, assists: 13, rebounds: 6, turnovers: 2}]-> (nets), + + +(luka)-[:PLAYED_AGAINST {minutes: 44, points: 23, assists: 7, rebounds: 13, turnovers: 8}]-> (bucks), +(kristaps)-[:PLAYED_AGAINST {minutes: 24, points: 16, assists: 2, rebounds: 12, turnovers: 0}]-> (bucks), +(giannis)-[:PLAYED_AGAINST {minutes: 33, points: 26, assists: 16, rebounds: 18, turnovers: 5}]-> (mavericks), +(khris)-[:PLAYED_AGAINST {minutes: 46, points: 35, assists: 3, rebounds: 4, turnovers: 3}]-> (mavericks), + +(luka)-[:PLAYED_AGAINST {minutes: 33, points: 28, assists: 6, rebounds: 3, turnovers: 3}]-> (sixers), +(kristaps)-[:PLAYED_AGAINST {minutes: 24, points: 18, assists: 4, rebounds: 11, turnovers: 1}]-> (sixers), +(joel)-[:PLAYED_AGAINST {minutes: 25, points: 29, assists: 7, rebounds: 22, turnovers: 2}]-> (mavericks), +(tobias)-[:PLAYED_AGAINST {minutes: 34, points: 18, assists: 13, rebounds: 4, turnovers: 0}]-> (mavericks), + +(giannis)-[:PLAYED_AGAINST {minutes: 45, points: 36, assists: 5, rebounds: 12, turnovers: 3}]-> (sixers), +(khris)-[:PLAYED_AGAINST {minutes: 35, points: 22, assists: 5, rebounds: 6, turnovers: 0}]-> (sixers), +(joel)-[:PLAYED_AGAINST {minutes: 33, points: 23, assists: 3, rebounds: 10, turnovers: 3}]-> (bucks), +(tobias)-[:PLAYED_AGAINST {minutes: 38, points: 23, assists: 4, rebounds: 5, turnovers: 1}]-> (bucks), + +(kevin)-[:PLAYED_AGAINST {minutes: 29, points: 28, assists: 6, rebounds: 8, turnovers: 0}]-> (mavericks), +(james)-[:PLAYED_AGAINST {minutes: 35, points: 17, assists: 10, rebounds: 8, turnovers: 5}]-> (mavericks), +(luka)-[:PLAYED_AGAINST {minutes: 37, points: 35, assists: 6, rebounds: 11, turnovers: 4}]-> (nets), +(kristaps)-[:PLAYED_AGAINST {minutes: 34, points: 27, assists: 4, rebounds: 8, turnovers: 0}]-> (nets), + +(lebron)-[:PLAYED_AGAINST {minutes: 32, points: 27, assists: 12, rebounds: 10, turnovers: 4}]-> (sixers), +(russell)-[:PLAYED_AGAINST {minutes: 25, points: 19, assists: 9, rebounds: 14, turnovers: 5}]-> (sixers), +(anthony)-[:PLAYED_AGAINST {minutes: 32, points: 22, assists: 7, rebounds: 12, turnovers: 2}]-> (sixers), +(joel)-[:PLAYED_AGAINST {minutes: 36, points: 36, assists: 7, rebounds: 12, turnovers: 0}]-> (lakers), +(tobias)-[:PLAYED_AGAINST {minutes: 32, points: 22, assists: 1, rebounds: 7, turnovers: 0}]-> (lakers); + + +# EXAMPLE +CALL apoc.load.jason("") YIELD value RETURN value LIMIT 10 + +# real file artificial intelligence papers : NOW IS IN THE IMPORT FOLDER INSIDE THE DB FOLDER +D:\data_researchgraph\json\artificial_intelligence.json + +# LINE TO GET VALUES +CALL apoc.load.json("file://D:/data_researchgraph/json/artificial_intelligence.json") YIELD value RETURN value LIMIT 10 + +CALL apoc.load.json("file://artificial_intelligence.json") YIELD value RETURN value LIMIT 10 + +# OPTIONS TO ENABLED IN THE NEO4J.CONF OR APOC.CONF : DONE IN THE APOC CONF FILE +DONE https://community.neo4j.com/t/setting-apoc-import-file-enabled-true-in-your-neo4j-conf/4293 + +apoc.export.file.enabled=true +apoc.import.file.enabled=true +apoc.import.file.use_neo4j_config=true + +# COMMON CODE LINES +MATCH (n) DETACH DELETE (n) +MATCH (n) RETURN n + +# conversor csv to json +https://csvjson.com/csv2json + +# CONFIG COLORS FOR OUR CASE PAPERS +PUBLICATION: CELESTE +RESEARCHER: GREEN +ORGANISATION: VIOLET +RESEARCH DATA : ORANGE + +# EXAMPLE HOW TO CREATE A TOY GRAPH FOR PAPERS, AUTHORS AND ORGANISATIONS +CREATE +(author1:AUTHOR{name:"R Westbrook", age: 33, number: 0, height: 1.91, weight: 91}), +(author2:AUTHOR{name:"L James", age: 36, number: 6, height: 2.06, weight: 113}), +(author3:AUTHOR{name:"A Davis", age: 28, number: 23, height: 2.08, weight: 115}), +(author4:AUTHOR{name:"J Morant", age: 22, number: 12, height: 1.91, weight: 79}), +(author5:AUTHOR{name:"L Doncic", age: 22, number: 77, height: 2.01, weight: 104}), +(author6:AUTHOR{name:"K Porzingis", age: 26, number: 6, height: 2.21, weight: 109}), +(author7:AUTHOR{name:"K Durant", age: 33, number: 7, height: 2.08, weight: 109}), +(author8:AUTHOR{name:"J Harden", age: 32, number: 13, height: 1.96, weight: 100}), +(author9:AUTHOR{name:"G Antetokounmpo", age: 26, number: 34, height: 2.11, weight: 110}), +(author10:AUTHOR{name:"K Middleton", age: 30, number: 22, height: 2.01, weight: 100}), +(author11:AUTHOR{name:"J Embiid", age: 27, number: 21, height: 2.13, weight: 127}), +(author12:AUTHOR{name:"T Harris", age: 29, number: 22, height: 2.03, weight: 100}), + +(frank:PAPER{name: "Paper 1", title: "title", journal: "journal", doi: "DOI1"}), +(taylor:PAPER{name: "Paper 2", title: "title", journal: "journal", doi: "DOI2"}), +(jason:PAPER{name: "Paper 3", title: "title", journal: "journal", doi: "DOI3"}), +(steve:PAPER{name: "Paper 4", title: "title", journal: "journal", doi: "DOI4"}), +(mike:PAPER{name: "Paper 5", title: "title", journal: "journal", doi: "DOI5"}), +(doc:PAPER{name: "Paper 6", title: "title", journal: "journal", doi: "DOI6"}), +(stan:PAPER{name: "Paper 7", title: "title", journal: "journal", doi: "DOI7"}), + +(institution1:INSTITUTION{name:"WSU"}), +(institution2:INSTITUTION{name:"Griffith University"}), +(institution3:INSTITUTION{name:"Bond University"}), +(institution4:INSTITUTION{name:"Southern Cross University"}), +(institution5:INSTITUTION{name:"QUT"}), +(institution6:INSTITUTION{name:"Monash University"}), + +(frank)-[:WAS_WRITTEN_BY]->(author1), +(frank)-[:WAS_WRITTEN_BY]->(author2), +(frank)-[:WAS_WRITTEN_BY]->(author3), +(taylor)-[:WAS_WRITTEN_BY]->(author4), +(jason)-[:WAS_WRITTEN_BY]->(author5), +(jason)-[:WAS_WRITTEN_BY]->(author6), +(steve)-[:WAS_WRITTEN_BY]->(author7), +(steve)-[:WAS_WRITTEN_BY]->(author8), +(mike)-[:WAS_WRITTEN_BY]->(author9), +(mike)-[:WAS_WRITTEN_BY]->(author10), +(doc)-[:WAS_WRITTEN_BY]->(author11), +(doc)-[:WAS_WRITTEN_BY]->(author12), +(stan)-[:WAS_WRITTEN_BY]->(author1), +(stan)-[:WAS_WRITTEN_BY]->(author12), + +(author1)-[:WORKS_FOR {salary: 40000000}]-> (institution1), +(author2)-[:WORKS_FOR {salary: 33000000}]-> (institution1), +(author3)-[:WORKS_FOR {salary: 38000000}]-> (institution1), +(author4)-[:WORKS_FOR {salary: 8000000}]-> (institution2), +(author5)-[:WORKS_FOR {salary: 50000000}]-> (institution3), +(author6)-[:WORKS_FOR {salary: 26000000}]-> (institution4), +(author7)-[:WORKS_FOR {salary: 45000000}]-> (institution5), +(author8)-[:WORKS_FOR{salary: 4200000}]-> (institution5), +(author9)-[:WORKS_FOR {salary: 47000000}]-> (institution6), +(author10)-[:WORKS_FOR {salary: 43000000}]-> (institution6), +(author11)-[:WORKS_FOR {salary: 4000000}]-> (institution6), +(author12)-[:WORKS_FOR {salary: 4000000}]-> (institution6), + +(frank)-[:IS_REF_IN]->(taylor), +(frank)-[:IS_REF_IN]->(jason), +(frank)-[:IS_REF_IN]->(doc), +(taylor)-[:IS_REF_IN]->(jason), +(jason)-[:IS_REF_IN]->(steve), +(steve)-[:IS_REF_IN]->(mike), +(mike)-[:IS_REF_IN]->(doc); + + +# Example 1 +https://www.youtube.com/watch?v=SDsov1IKtE8 +https://github.com/ronidas39/neo4j_python_use_cases + +CALL apoc.load.json("file://sample2.json") +YIELD value +WITH size(value.subjects) as subject_count, value +RETURN subject_count, value.name as name, value.subjects as subjects + +CALL apoc.load.json("file://chunk_1.json") +YIELD value +WITH size(value.author) as subject_count, value +RETURN subject_count, value.id as id, value.author as authors + +CALL apoc.load.json("file:///chunks/chunk_1.json") +YIELD value +WITH size(value.author) as subject_count, value +RETURN subject_count, value.id as id, value.author as authors + +# exanple 1.2 +https://stackoverflow.com/questions/57382640/neo4j-create-nodes-from-nested-json-file-and-list + +CALL apoc.load.json('file:///data.json') YIELD value as v +MERGE (o:org {name: v.organization}) + +CALL apoc.load.json("file:///chunks/chunk_1.json") YIELD value as v +MERGE (p:id {name: v.id}) + + +# example 2 +https://medium.com/aarth-software/data-ingestion-with-neo4j-leveraging-csv-and-json-8d25b9705b3 + +CALL apoc.load.json('file://Customer_DF.json') +YIELD value +WITH value +MERGE(c:Customer{customer_email:value.customerEmail,customer_device:value.customerDevice}) +SET c.customer_phone= value.customerPhone, c.customerip_address= value.customerIPAddress, c.customerbilling_address= value.customerBillingAddress +RETURN c + +CALL apoc.load.json('file://cust_transaction_details.json') +YIELD value +MERGE (o:Order {order_id: value.orderId, transaction_id: value.transactionId}) +SET o.payment_methodid = value.paymentMethodId, + o.paymentmethodregistration_failure = CASE value.paymentMethodRegistrationFailure WHEN '0' THEN FALSE WHEN '1' THEN TRUE END, + o.payment_methodtype = value.paymentMethodType, + o.paymentmethod_provider = value.payment_methodprovider, + o.transaction_amount = toInteger(value.transactionAmount), + o.transaction_failed = CASE value.transactionFailed WHEN '0' THEN FALSE WHEN '1' THEN TRUE END, + o.order_state = value.orderState +RETURN o + +CALL apoc.load.json('file://cust_transaction_details.json') +YIELD value +WITH value +MATCH(c:Customer{customer_email:value.customerEmail}) +MATCH(o:Order{order_id:value.orderId, transaction_id: value.transactionId}) +MERGE (c)-[r:MADE_TRANSACTION]->(o) +RETURN c,o + +# EXAMPLE 3 with APOC PERIODIC ITERATE +https://stackoverflow.com/questions/42768919/how-to-import-very-large-geojson-files-into-neo4j + +CALL apoc.periodic.iterate( + "CALL apoc.load.json('https://dummyjson.com/products', '$.features') YIELD value AS features", + "UNWIND features as feature MERGE (r:Road {wkt:feature.properties.wkt})", + {batchSize:1000, parallel:true} +) + +CALL apoc.periodic.iterate( + "CALL apoc.load.json('https://dummyjson.com/products', '$.features') YIELD value AS features", + "UNWIND features as feature MERGE (r:Road {wkt:feature.properties.wkt})", + {batchSize:1000, parallel:true} + ) + +# eXAMPLE 4: neo4j documentation +https://aura.support.neo4j.com/hc/en-us/articles/1500012376402-Using-apoc-to-conditional-loading-large-scale-data-set-from-JSON-or-CSV-files + +CALL apoc.periodic.iterate( + "CALL apoc.load.json('file:////Users/example/Neo4j/Aura/users.json') + YIELD value AS data", + "CALL apoc.do.case( + [ + data.uuid is NOT null, 'MERGE (u:User {uuid: data.uuid}) ON CREATE SET u.city=data.city', + data.id is NOT null, 'MERGE (u:User {id: data.id}) ON CREATE SET u.city=data.city' + ], + 'CREATE (u:User) SET u.Name=data.Name', + {data:data} +) YIELD value RETURN value", +{batchSize:2, parallel:false}) + +# analisis de la carpeta con los archivos por paper (json) +501629 articulos +size 5 gb +size in disk 5.76 gb + + +# COMMON CODE LINES +MATCH (n) DETACH DELETE (n) +MATCH (n) RETURN n + +# paper +CALL apoc.load.json("file:///chunks/chunk_3.json") +YIELD value +WITH value +MERGE (paper:PAPER {name: value.doi, code: value.id, doi: value.doi, url: value.url}) + +# organisations (AFFILIATIONS) +CALL apoc.load.json("file:///chunks/chunk_3.json") +YIELD value +WITH value.author AS authors +UNWIND authors AS au +UNWIND au.affiliation as affiliation +MERGE (o:ORGANISATION {name: affiliation.name}) +RETURN o + +# authors +CALL apoc.load.json("file:///chunks/chunk_3.json") +YIELD value +WITH value.author AS authors +UNWIND authors AS au +MERGE (a:AUTHOR {name: au.family}) +RETURN a + +# authors 2 +CALL apoc.load.json("file:///chunks/chunk_3.json") +YIELD value +WITH value.author AS authors +UNWIND authors AS au +UNWIND au.affiliation as affiliation +MERGE (a:AUTHOR {name: au.family}) ON CREATE SET a.given = au.given, a.affiliation = affiliation.name, a.fullname = COALESCE(au.given ,"") + ',' + COALESCE(au.family ,"") +RETURN a + +# authors 3 +CALL apoc.load.json("file:///chunks/chunk_3.json") +YIELD value +WITH value.author AS authors +UNWIND authors AS au +UNWIND au.affiliation as affiliation +MERGE (a:AUTHOR {name: COALESCE(au.given ,"") + ',' + COALESCE(au.family ,"")}) ON CREATE SET a.given = au.given, a.family = au.family, a.affiliation = affiliation.name +RETURN a + +# authors 4 +CALL apoc.load.json("file:///chunks/chunk_3.json") +YIELD value +WITH value.author AS authors, value.id as code +UNWIND authors AS au +UNWIND au.affiliation as affiliation +MERGE (a:AUTHOR {name: COALESCE(au.given ,"") + ',' + COALESCE(au.family ,"")}) ON CREATE SET a.given = au.given, a.family = au.family, a.affiliation = affiliation.name +MERGE (p:PAPER {name: code}) +MERGE (o:ORGANISATION {name: affiliation.name}) +MERGE (p)-[:WRITTEN_BY]->(a) +MERGE (a)-[:IS_PART_OF]->(o) +RETURN a, p, o + +# count elements for nodes for each label +MATCH (a:AUTHOR) +WITH count(a) AS count +RETURN 'Author' AS label, count +UNION ALL +MATCH (o:ORGANISATION) +WITH count(o) AS count +RETURN 'Organisation' AS label, count +UNION ALL +MATCH (p:PAPER) +WITH count(p) AS count +RETURN 'Paper' AS label, count + +# degree +create the graph: + +CALL gds.graph.project( + 'myGraph2', + 'AUTHOR', + { + WRITTEN_BY: { + orientation: 'UNDIRECTED' + + } + } +) + +get the metrics sorted: + +CALL gds.degree.stream('myGraph2') +YIELD nodeId, score +RETURN gds.util.asNode(nodeId).name AS name, score AS Centrality +ORDER BY Centrality DESC, name DESC + + +# READINGS +ABOUT CONCATENATE PROPERTIES TO CREATE NODES https://community.neo4j.com/t/concat-attributes-as-string/13519 +ABOUT TIPE MISTMATCH ERROR WHEN CREATING A VALUE (SOMETIMES FOR THE VALUE AFFILIATION BECAUSE IT HAS A FIELD CALLED NAME) https://stackoverflow.com/questions/57961933/neo4j-neo-clienterror-statement-typeerror-type-mismatch-expected-a-map-but-was +CREATE NODES FROM NESTED JSON https://stackoverflow.com/questions/57382640/neo4j-create-nodes-from-nested-json-file-and-list +ABOUT JSON MEMORY STREAMING USING IJSON IN PYTHON https://pythonspeed.com/articles/json-memory-streaming/ +USING PYTHON TO LOAD IN LAZY MODE A BIG JSON https://stackoverflow.com/questions/41585138/python-read-1gb-json-file-using-lazy-method +How to manage a large JSON file efficiently and quickly https://sease.io/2021/10/how-to-manage-a-large-json-file-efficiently-and-quickly.html + +Data ingestion from csv and jsons to NEO4J https://medium.com/aarth-software/data-ingestion-with-neo4j-leveraging-csv-and-json-8d25b9705b3 + +load a big json in neo4j - converting it into csv (?) https://stackoverflow.com/questions/43385030/importing-bulk-json-data-into-neo4j + +NEO4J DODOCUMENTATION - data import API https://neo4j.com/docs/getting-started/data-import/ +NEO4J DOCUMENTATION - load json https://neo4j.com/docs/apoc/current/import/load-json/ +NEO4J DOCUMENTATION - FOREACH https://neo4j.com/docs/cypher-manual/current/clauses/foreach/ +NEO4J COMMUNITY - How to "loop" query? https://community.neo4j.com/t/how-to-loop-query/34692 + +NEO4J DOCUMENTATION - Degree centrality https://neo4j.com/docs/graph-data-science/current/algorithms/degree-centrality/ + +Using apoc to conditional loading large scale data set from JSON or CSV files https://aura.support.neo4j.com/hc/en-us/articles/1500012376402-Using-apoc-to-conditional-loading-large-scale-data-set-from-JSON-or-CSV-files + +NEO4J Tutorial Python Load json data from file using Neo4j Cypher, Apoc (using Jupyter notebook to connect Neo4j db) https://www.youtube.com/watch?v=SDsov1IKtE8&t=826s + +# The resulting values are in the following table + label count +"Author" 45709 +"Organisation" 30569 +"Paper" 99697 + + label count +"Author" 55315 +"Organisation" 38009 +"Paper" 147322 + +label count +"Author" 58394 +"Organisation" 39960 +"Paper" 161991 + + label count +"Author" 60346 +"Organisation" 41253 +"Paper" 167650 + + + From 0010062499d5b810d03e9c512289d97c0bec4411 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:29:37 -0300 Subject: [PATCH 16/50] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 66a0688..ac0ec81 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Activities The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python 🐍 to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. -The file [**Transform_BIG_JSON.ipynb**](/Transform_BIG_JSON.ipynb) shows the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. +The file [**Transform_BIG_JSON.ipynb**](/Transform_BIG_JSON.ipynb) shows the Jupyter notebook with the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. It was considered to get 3 types of nodes: - AUTHOR @@ -86,7 +86,7 @@ To create the nodes for AUTHORS and the relationships with PAPERS and ORGANISATI MERGE (a)-[:IS_PART_OF]->(o) RETURN a, p, o -The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of given name and family name, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook **ResearchGraph4Neo4j3.ipynb** shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. The image shows part of the nodes created in the graph db. +The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of given name and family name, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook [**ResearchGraph4Neo4j3.ipynb**](/ResearchGraph4Neo4j3.ipynb) shows the Jupyter notebook with the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. The image shows part of the nodes created in the graph db. Alt text @@ -118,7 +118,7 @@ Using the iterative method to populate the graph db, because the low optimal app | Organisations | 41253 | | Papers | 167650 | -Knowing that these are not the total values, I double check the values using a Python Script to analise the BIG JSON file and obtain the unique values for PAPERS (id: id or doi), AUTHORS (id: given name + family name) and ORGANISATIONS (id: name). The script is called **explore_JSON.ipynb** and the resulting values are: +Knowing that these are not the total values, I double check the values using a Python Script to analise the BIG JSON file and obtain the unique values for PAPERS (id: id or doi), AUTHORS (id: given name + family name) and ORGANISATIONS (id: name). The script is called [**explore_JSON.ipynb**](/explore_JSON.ipynb) and the resulting values are: | ITEM | COUNT | |----------------------|--------| @@ -130,7 +130,7 @@ Knowing that these are not the total values, I double check the values using a P (*) Note: The original number of articles (papers, conferences journals, chapters, etc) is 501629. However, some of them were ignored due to the presence of problems in some fields. For instance, in some cases, inside the field **authors** some records have the affiliation as an author, which was avoided by reviewing the properties of each author in the for loops. This could be solved with a more tailored approach to consider ALL the posibilities in terms of fields, according to predefined criterias. -For more details about construction of queries, resources, references, examples, and additional information, please, review the document **neo4j_examples.txt**. +For more details about construction of queries, resources, references, examples, and additional information, please, review the document [**neo4j_examples.txt**](/neo4j_examples.txt). ## Task 2 From 2430e4a3af76175dffc0890e8cdf9ff36093f777 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:33:23 -0300 Subject: [PATCH 17/50] new version of the transform_big_json notebook --- Transform_BIG_JSON.ipynb | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Transform_BIG_JSON.ipynb b/Transform_BIG_JSON.ipynb index c28098e..0f8fc1f 100644 --- a/Transform_BIG_JSON.ipynb +++ b/Transform_BIG_JSON.ipynb @@ -21,11 +21,12 @@ "\n", "path_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", "file_name = 'artificial_intelligence.json'\n", - "output_name = 'D:\\\\data_researchgraph\\\\json\\\\'\n", + "output_name = 'D:\\\\data_researchgraph\\\\json\\\\paps\\\\'\n", "\n", "user_to_repos = {}\n", "contador = 0\n", - "#limite = 10\n", + "limite = 10\n", + "uselimit = False\n", "\n", "with open(path_name+file_name, \"rb\") as f:\n", " for record in ijson.items(f, \"item\"):\n", @@ -48,18 +49,14 @@ " new_record = {'id': id, 'url': url, 'author': author, 'doi': doi, 'ref': ref}\n", "\n", " #record.to_json(path_name+'chunk_{}.json'.format(i))\n", - " with open(path_name+'paper_{}.json'.format(contador+1), \"w\") as fp:\n", + " with open(output_name+'paper_{}.json'.format(contador+1), \"w\") as fp:\n", " json.dump(new_record , fp, indent=4) \n", "\n", - " #user = record[\"actor\"][\"login\"]\n", - " #repo = record[\"repo\"][\"name\"]\n", - " #if user not in user_to_repos:\n", - " # user_to_repos[user] = set()\n", - " #user_to_repos[user].add(repo)\n", - "\n", " contador = contador + 1\n", - " #if contador==limite:\n", - " # break" + " \n", + " if uselimit:\n", + " if contador==limite:\n", + " break" ] }, { From e96343c01f0a04d288e15b22bf8fbf6cca4f6a73 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:34:05 -0300 Subject: [PATCH 18/50] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ac0ec81..9904393 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,9 @@ Activities - Generate a Python code to connect to the graph db and perform the queries - Iterate through the queries via Python and Neo4j Python package - Populate and create the nodes for **AUTHORS**, **PAPERS**, and **ORGANISATIONS** -- create the relationships **PAPER -[WRITTEN_BY]-> AUTHOR** & **AUTHOR -[IS_PART_OF]-> ORGANISATION** +- Create the relationships: + - **PAPER -[WRITTEN_BY]-> AUTHOR** + - **AUTHOR -[IS_PART_OF]-> ORGANISATION** The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python 🐍 to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. From 858147cfb259f49b4632382f4bc0994ff39dc617 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:43:43 -0300 Subject: [PATCH 19/50] Update README.md --- README.md | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 9904393..072efb7 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ Note: you only need to commit the notebook, and you do not need to provide a bac ## Answers for Task 1 💻 -1.1 - Data into the db +1.1 - Get the Data into the graph db -In order to load the data in Neo4j, it was neccesary to manipulate the original JSON file, explore it using Python, and then find the way to push it into the Neo4j. The following list of activities show an overview of the performed steps: +In order to load the data in Neo4j, it was neccesary to manipulate the original JSON file, explore it using Python 🐍, and then find the way to get it into the Neo4j. The following list of activities show an overview of the performed steps: Activities - Manipulate the big JSON to check the most suitable way to get chunks of data @@ -43,17 +43,17 @@ Activities - **PAPER -[WRITTEN_BY]-> AUTHOR** - **AUTHOR -[IS_PART_OF]-> ORGANISATION** -The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python 🐍 to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. +The JSON file (after unzip) has a size of around 4.8 GB. This big JSON file cannot be directly load into memory or by JSON package even in Python. After carefully consider the options to load this big JSON, considering the use of Neo4j + APOC, and the limited resources of my local machine, I decided to go for a very non optimal way. I split the big JSON into smaller JSON files, and then to load the data by chunks in the Neo4j DB (Desktop version 5.3.0 + APOC), and using Python to iterate through the files and queries, in order of getting the chunks of JSON to populate the graph DB. -The file [**Transform_BIG_JSON.ipynb**](/Transform_BIG_JSON.ipynb) shows the Jupyter notebook with the Python 🐍 code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. +The file [**Transform_BIG_JSON.ipynb**](/Transform_BIG_JSON.ipynb) shows the Jupyter notebook with the Python code to get chunks of JSON from a big JSON file. The size of the chunks can be configurable. It was considered to get 3 types of nodes: -- AUTHOR -- PAPER -- ORGANISATION +- **AUTHOR** +- **PAPER** +- **ORGANISATION** and 2 types of relationships: -- WRITTEN_BY: PAPER -[WRITTEN_BY]-> AUTHOR -- IS_PART_OF: AUTHOR -[IS_PART_OF]-> ORGANISATION +- WRITTEN_BY: **PAPER -[WRITTEN_BY]-> AUTHOR** +- IS_PART_OF: **AUTHOR -[IS_PART_OF]-> ORGANISATION** In the case of 1 item (article) per JSON the reading and creation of nodes is done. For each JSON file (eg. paper_1.json), i.e., for each article, the following procedures were performed using Cypher: @@ -88,7 +88,9 @@ To create the nodes for AUTHORS and the relationships with PAPERS and ORGANISATI MERGE (a)-[:IS_PART_OF]->(o) RETURN a, p, o -The identifier for PAPERS were the id of each JSON element, for AUTHORS the identifier was the combination of given name and family name, and for ORGANISATIONS, the identifier was the name of the affiliation. This is not the best option, but it was the best generalisable way to call and connect the nodes. To iterate these procedures, the Jupyter notebook [**ResearchGraph4Neo4j3.ipynb**](/ResearchGraph4Neo4j3.ipynb) shows the Jupyter notebook with the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps are done for all the generated JSON files. The image shows part of the nodes created in the graph db. +The identifier for **PAPERS** were the **id** of each JSON element, for **AUTHORS** the identifier was the combination of **given name** and the **family name**, and for **ORGANISATIONS**, the identifier was the **name** of the affiliation (when available). This is not the best option, but it was the best generalisable way to call and connect all the possible nodes. The ideal scenario would be to use the DOI for each article, the ORCID for each author, and verified identifier for institutions or organisations, however, that is not the case. + +To iterate these procedures, the Jupyter notebook [**ResearchGraph4Neo4j3.ipynb**](/ResearchGraph4Neo4j3.ipynb) shows the Python 🐍 code where each query is built to be an iterable string, using an iterable index to call each small JSON file. All the steps were done for all the generated chunk JSON files. The image shows part of the nodes created in the graph db. Alt text @@ -112,15 +114,15 @@ Once the data is all in the Graph db, we can create a query to get the number of WITH count(p) AS count RETURN 'Paper' AS label, count -Using the iterative method to populate the graph db, because the low optimal approach used here, the process was able to get just 168116 records from a total of 501629 records in my local machine. The resulting values are in the following table +Using the iterative method to populate the graph db, because the low optimal approach used here, the process was able to get just **174077** records from a total of **501629** records in my local machine. The resulting values are in the following table | label | count | |---------------|--------| -| Authors | 60346 | -| Organisations | 41253 | -| Papers | 167650 | +| Authors | 63203 | +| Organisations | 42992 | +| Papers | 174098 | -Knowing that these are not the total values, I double check the values using a Python Script to analise the BIG JSON file and obtain the unique values for PAPERS (id: id or doi), AUTHORS (id: given name + family name) and ORGANISATIONS (id: name). The script is called [**explore_JSON.ipynb**](/explore_JSON.ipynb) and the resulting values are: +Knowing that these are not the total values, I double checked the values using a Python Script to analise the BIG JSON file and obtain the unique values for **PAPERS** (**id**: id or doi), **AUTHORS** (**id**: given name + family name) and **ORGANISATIONS** (**id**: name). The script is called [**explore_JSON.ipynb**](/explore_JSON.ipynb) and the resulting values are: | ITEM | COUNT | |----------------------|--------| @@ -134,6 +136,13 @@ This could be solved with a more tailored approach to consider ALL the posibilit For more details about construction of queries, resources, references, examples, and additional information, please, review the document [**neo4j_examples.txt**](/neo4j_examples.txt). +Additional issues: +- Some articles don't have author information +- Some authors don't have affiliation information +- Some affiliations have a different format: some of them have a name, some of them have an id or url. +- Some authors don't have the complete information +- Some authors don't have a orcid id + ## Task 2 2.1 - Calculate the following measures in this data From de0c2f1c8c4ec1c050d80aac9c40b05ece156663 Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:53:10 -0300 Subject: [PATCH 20/50] add an additional image --- example_papers_graph0.png | Bin 0 -> 113850 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 example_papers_graph0.png diff --git a/example_papers_graph0.png b/example_papers_graph0.png new file mode 100644 index 0000000000000000000000000000000000000000..4392d4da4f0c276f960d4b25e392b1226340dc2d GIT binary patch literal 113850 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 Cd@lC@ literal 0 HcmV?d00001 From de5733726fdde2ddedc95ab13fae2da7ce02afaf Mon Sep 17 00:00:00 2001 From: Aland Date: Wed, 4 Oct 2023 00:54:13 -0300 Subject: [PATCH 21/50] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 072efb7..316dfae 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,10 @@ and 2 types of relationships: - WRITTEN_BY: **PAPER -[WRITTEN_BY]-> AUTHOR** - IS_PART_OF: **AUTHOR -[IS_PART_OF]-> ORGANISATION** +The next figure shows the general schema for 1 paper as node: + +Alt text + In the case of 1 item (article) per JSON the reading and creation of nodes is done. For each JSON file (eg. paper_1.json), i.e., for each article, the following procedures were performed using Cypher: To create the nodes for PAPERS: From 7fe4a8d0f87603352c21504f98ca88b23a23b450 Mon Sep 17 00:00:00 2001 From: Aland Date: Thu, 5 Oct 2023 22:25:59 -0300 Subject: [PATCH 22/50] Create readme.md readme images --- imag/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 imag/readme.md diff --git a/imag/readme.md b/imag/readme.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/imag/readme.md @@ -0,0 +1 @@ + From 97ff0d6e25f1b06915caf715b47534be5f4b1a97 Mon Sep 17 00:00:00 2001 From: Aland Date: Thu, 5 Oct 2023 22:27:17 -0300 Subject: [PATCH 23/50] add images to imag folder --- imag/EXAMPLE_GRAPH1.png | Bin 0 -> 162050 bytes imag/example_papers_graph.png | Bin 0 -> 107197 bytes imag/example_papers_graph0.png | Bin 0 -> 113850 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 imag/EXAMPLE_GRAPH1.png create mode 100644 imag/example_papers_graph.png create mode 100644 imag/example_papers_graph0.png diff --git a/imag/EXAMPLE_GRAPH1.png b/imag/EXAMPLE_GRAPH1.png new file mode 100644 index 0000000000000000000000000000000000000000..261612c023aceb2ccf0c441610bd0a642dd4b419 GIT binary patch literal 162050 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