From 2cad3ebb8cace0b3a28b98e619c2c65008c27bfb Mon Sep 17 00:00:00 2001
From: Malte Schokolowski <baw8441@uni-hamburg.de>
Date: Mon, 13 Dec 2021 13:45:05 +0100
Subject: [PATCH] bugs fixed and added graph plan for test graphs

---
 .../construct_new_graph/Processing.py         |  14 +-
 .../construct_new_graph/add_citations_rec.py  |  19 +--
 verarbeitung/get_pub_from_input.py            |   5 +-
 verarbeitung/json_text.json                   |   2 +-
 verarbeitung/test/Processing_unittest.py      | 128 +++++++++---------
 verarbeitung/test/input_test.py               |  32 ++---
 verarbeitung/test/test_graphs_plan.pdf        | Bin 0 -> 11174 bytes
 verarbeitung/test_output.json                 |   2 +-
 verarbeitung/update_graph/update_graph_del.py |  18 ++-
 9 files changed, 109 insertions(+), 111 deletions(-)
 create mode 100644 verarbeitung/test/test_graphs_plan.pdf

diff --git a/verarbeitung/construct_new_graph/Processing.py b/verarbeitung/construct_new_graph/Processing.py
index 34e5e21..0f3dc51 100644
--- a/verarbeitung/construct_new_graph/Processing.py
+++ b/verarbeitung/construct_new_graph/Processing.py
@@ -86,14 +86,14 @@ def complete_inner_edges():
     for node in nodes:
         if (node.group < 0):
             for citation in node.citations:
-                for cit in nodes:
-                    if (citation == cit.doi_url and [citation, node.doi_url] not in edges):
-                        edges.append([citation, node.doi_url])
+                for pub in nodes:
+                    if ((pub.doi_url == citation.doi_url) and ([citation.doi_url, node.doi_url] not in edges)):
+                        edges.append([citation.doi_url, node.doi_url])
         if (node.group > 0):
             for reference in node.references:
-                for ref in nodes:
-                    if (reference == ref.doi_url and [node.doi_url, reference] not in edges):
-                        edges.append([node.doi_url,reference])
+                for pub in nodes:
+                    if ((pub.doi_url == reference.doi_url) and ([node.doi_url, reference.doi_url] not in edges)):
+                        edges.append([node.doi_url,reference.doi_url])
 
 
 def process_main(doi_input_list, search_height, search_depth, test_var = False):
@@ -142,6 +142,6 @@ def process_main(doi_input_list, search_height, search_depth, test_var = False):
     complete_inner_edges()
 
     # calls a skript to save nodes and edges of graph in .json file
-    output_to_json(nodes,edges, test_var)
+    output_to_json(nodes, edges, test_var)
 
     return(nodes,edges)
diff --git a/verarbeitung/construct_new_graph/add_citations_rec.py b/verarbeitung/construct_new_graph/add_citations_rec.py
index 4c2cac9..2faab32 100644
--- a/verarbeitung/construct_new_graph/add_citations_rec.py
+++ b/verarbeitung/construct_new_graph/add_citations_rec.py
@@ -95,12 +95,12 @@ def create_graph_structure_citations(pub, search_depth, search_depth_max, cit_ty
     for citation in get_cit_type_list(pub, cit_type):
         not_in_nodes = True
         for node in nodes: # checks every citation for duplication 
-            if (citation == node.doi_url):
+            if (citation.doi_url == node.doi_url):
                 not_in_nodes = False
                 break
         if (not_in_nodes):
             if (search_depth < search_depth_max): #checks if its a test and chooses input function accordingly
-                citation_pub_obj = get_pub(citation, test_var)
+                citation_pub_obj = get_pub(citation.doi_url, test_var)
                 if (type(citation_pub_obj) != Publication):
                     print(pub)
                     continue 
@@ -114,13 +114,14 @@ def create_graph_structure_citations(pub, search_depth, search_depth_max, cit_ty
                 nodes.append(citation_pub_obj)                   
                 citations_pub_obj_list.append(citation_pub_obj)
 
-        # adds only edge if citation already exists   
-        elif (cit_type == "Citation"):      
-            if ([citation,pub.doi_url] not in edges):
-                edges.append([citation,pub.doi_url])
-        elif (cit_type == "Reference"):
-            if ([pub.doi_url,citation] not in edges):
-                edges.append([pub.doi_url,citation])   
+        # adds just the edge if citation already exists   
+        else:
+            if (cit_type == "Citation"):      
+                if ([citation.doi_url,pub.doi_url] not in edges):
+                    edges.append([citation.doi_url,pub.doi_url])
+            else:
+                if ([pub.doi_url,citation.doi_url] not in edges):
+                    edges.append([pub.doi_url,citation.doi_url])   
     return citations_pub_obj_list
 
 
diff --git a/verarbeitung/get_pub_from_input.py b/verarbeitung/get_pub_from_input.py
index e3fdedd..2766ba8 100644
--- a/verarbeitung/get_pub_from_input.py
+++ b/verarbeitung/get_pub_from_input.py
@@ -33,15 +33,14 @@ def get_pub(pub_doi, test_var):
         function to return an object of type Publication for given input doi depending on whether its a test or url doi
     '''
     #checks if it's a test and chooses appropiate function
-    # print(pub_doi)
     if(test_var): 
-            pub = input_test_func(pub_doi) 
+        pub = input_test_func(pub_doi) 
 
     #checks that it isnt a test and chooses standart-input function
     else: 
         inter = Input()
         try:
-            pub = inter.get_publication(pub_doi.doi_url) #creates an object of class Publication
+            pub = inter.get_publication(pub_doi) #creates an object of class Publication
         except AttributeError:
             pub = inter.get_publication(pub_doi)
         except ValueError:
diff --git a/verarbeitung/json_text.json b/verarbeitung/json_text.json
index 36aad96..183e764 100644
--- a/verarbeitung/json_text.json
+++ b/verarbeitung/json_text.json
@@ -1 +1 @@
-{"nodes": [{"doi": "https://doi.org/10.1021/acs.jcim.9b00249", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Applications and Filter Collection Analysis", "author": ["Emanuel S. R. Ehmki", "Robert Schmidt", "Farina Ohm", "Matthias Rarey"], "year": "May 24, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 5}, {"doi": "https://doi.org/10.1021/acs.chemrev.1c00107", "name": "Combining Machine Learning and Computational Chemistry for Predictive Insights Into Chemical Systems", "author": ["John A. Keith", "Valentin Vassilev-Galindo", "Bingqing Cheng", "Stefan Chmiela", "Michael Gastegger", "Klaus-Robert M\u00fcller", "Alexandre Tkatchenko"], "year": "July 7, 2021", "journal": "Chem. Rev.", "group": "Input", "depth": 0, "citations": 2}, {"doi": "https://doi.org/10.1021/acs.jcim.0c00741", "name": "Disconnected Maximum Common Substructures under Constraints", "author": ["Robert Schmidt", "Florian Krull", "Anna Lina Heinzke", "Matthias Rarey"], "year": "December 16, 2020", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jmedchem.0c01332", "name": "Evolution of Novartis\u2019 Small Molecule Screening Deck Design", "author": ["Ansgar Schuffenhauer", "Nadine Schneider", "Samuel Hintermann", "Douglas Auld", "Jutta Blank", "Simona Cotesta", "Caroline Engeloch", "Nikolas Fechner", "Christoph Gaul", "Jerome Giovannoni", "Johanna Jansen", "John Joslin", "Philipp Krastel", "Eugen Lounkine", "John Manchester", "Lauren G. Monovich", "Anna Paola Pelliccioli", "Manuel Schwarze", "Michael D. Shultz", "Nikolaus Stiefl", "Daniel K. Baeschlin"], "year": "November 3, 2020", "journal": "Journal of Medicinal Chemistry", "group": "Input", "depth": 0, "citations": 8}, {"doi": "https://doi.org/10.1021/acs.jcim.9b00250", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Theory and Algorithms", "author": ["Robert Schmidt", "Emanuel S. R. Ehmki", "Farina Ohm", "Hans-Christian Ehrlich", "Andriy Mashychev", "Matthias Rarey"], "year": "May 23, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 12}], "links": [{"source": "https://doi.org/10.1021/acs.chemrev.1c00107", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00250", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}]}
\ No newline at end of file
+{"nodes": [{"doi": "https://doi.org/10.1021/acs.jcim.9b00249", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Applications and Filter Collection Analysis", "author": ["Emanuel S. R. Ehmki", "Robert Schmidt", "Farina Ohm", "Matthias Rarey"], "year": "May 24, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Input", "depth": 0, "citations": 5}, {"doi": "https://doi.org/10.1021/acs.chemrev.1c00107", "name": "Combining Machine Learning and Computational Chemistry for Predictive Insights Into Chemical Systems", "author": ["John A. Keith", "Valentin Vassilev-Galindo", "Bingqing Cheng", "Stefan Chmiela", "Michael Gastegger", "Klaus-Robert M\u00fcller", "Alexandre Tkatchenko"], "year": "July 7, 2021", "journal": "Chem. Rev.", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "https://doi.org/10.1021/acs.jcim.0c00741", "name": "Disconnected Maximum Common Substructures under Constraints", "author": ["Robert Schmidt", "Florian Krull", "Anna Lina Heinzke", "Matthias Rarey"], "year": "December 16, 2020", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 1, "citations": 0}, {"doi": "https://doi.org/10.1021/acs.jmedchem.0c01332", "name": "Evolution of Novartis\u2019 Small Molecule Screening Deck Design", "author": ["Ansgar Schuffenhauer", "Nadine Schneider", "Samuel Hintermann", "Douglas Auld", "Jutta Blank", "Simona Cotesta", "Caroline Engeloch", "Nikolas Fechner", "Christoph Gaul", "Jerome Giovannoni", "Johanna Jansen", "John Joslin", "Philipp Krastel", "Eugen Lounkine", "John Manchester", "Lauren G. Monovich", "Anna Paola Pelliccioli", "Manuel Schwarze", "Michael D. Shultz", "Nikolaus Stiefl", "Daniel K. Baeschlin"], "year": "November 3, 2020", "journal": "Journal of Medicinal Chemistry", "group": "Citedby", "depth": 1, "citations": 8}, {"doi": "https://doi.org/10.1021/acs.jcim.9b00250", "name": "Comparing Molecular Patterns Using the Example of SMARTS: Theory and Algorithms", "author": ["Robert Schmidt", "Emanuel S. R. Ehmki", "Farina Ohm", "Hans-Christian Ehrlich", "Andriy Mashychev", "Matthias Rarey"], "year": "May 23, 2019", "journal": "Journal of Chemical Information and Modeling", "group": "Citedby", "depth": 1, "citations": 12}], "links": [{"source": "https://doi.org/10.1021/acs.chemrev.1c00107", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00250", "target": "https://doi.org/10.1021/acs.jcim.9b00249"}, {"source": "https://doi.org/10.1021/acs.chemrev.1c00107", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.0c00741", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jmedchem.0c01332", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}, {"source": "https://doi.org/10.1021/acs.jcim.9b00249", "target": "https://doi.org/10.1021/acs.jcim.9b00250"}]}
\ No newline at end of file
diff --git a/verarbeitung/test/Processing_unittest.py b/verarbeitung/test/Processing_unittest.py
index a595b44..47dd268 100644
--- a/verarbeitung/test/Processing_unittest.py
+++ b/verarbeitung/test/Processing_unittest.py
@@ -12,16 +12,16 @@ class ProcessingTest(unittest.TestCase):
      maxDiff = None
 
 
-     # def testCycle(self):
-     #     nodes, edges = process_main(['doiz1'],1,1,True)
-     #     doi_nodes = keep_only_dois(nodes)
-     #     self.assertCountEqual(doi_nodes, ['doiz1', 'doiz2'])
-     #     self.assertCountEqual(edges, [['doiz1', 'doiz2'], ['doiz2', 'doiz1']])
+     def testCycle(self):
+         nodes, edges = process_main(['doiz1'],1,1,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doiz1', 'doiz2'])
+         self.assertCountEqual(edges, [['doiz1', 'doiz2'], ['doiz2', 'doiz1']])
 
-     #     nodes, edges = process_main(['doiz1'],2,2,True)
-     #     doi_nodes = keep_only_dois(nodes)
-     #     self.assertCountEqual(doi_nodes, ['doiz1', 'doiz2'])
-     #     self.assertCountEqual(edges, [['doiz2', 'doiz1'], ['doiz1', 'doiz2']])
+         nodes, edges = process_main(['doiz1'],2,2,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doiz1', 'doiz2'])
+         self.assertCountEqual(edges, [['doiz2', 'doiz1'], ['doiz1', 'doiz2']])
 
     #def testBigCycle(self):
 
@@ -29,66 +29,66 @@ class ProcessingTest(unittest.TestCase):
 
     #def testEmptyDepth(self):
 
-     # def testEmptyDepthHeight(self):
-     #     nodes, edges = process_main(['doi1'],0,0,True)
-     #     doi_nodes = keep_only_dois(nodes)
-     #     self.assertCountEqual(doi_nodes,['doi1'])
-     #     self.assertCountEqual(edges, [])
+     def testEmptyDepthHeight(self):
+         nodes, edges = process_main(['doi1'],0,0,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes,['doi1'])
+         self.assertCountEqual(edges, [])
 
-     #     nodes, edges = process_main(['doi1', 'doi2'],0,0,True)
-     #     doi_nodes = keep_only_dois(nodes)
-     #     self.assertCountEqual(doi_nodes, ['doi1','doi2'])
-     #     self.assertCountEqual(edges, [['doi1', 'doi2']])
+         nodes, edges = process_main(['doi1', 'doi2'],0,0,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doi1','doi2'])
+         self.assertCountEqual(edges, [['doi1', 'doi2']])
 
-     #     nodes, edges = process_main(['doi1', 'doi2', 'doi3'],0,0,True)
-     #     doi_nodes = keep_only_dois(nodes)
-     #     self.assertCountEqual(doi_nodes, ['doi1','doi2', 'doi3'])
-     #     self.assertCountEqual(edges, [['doi3', 'doi1'], ['doi1', 'doi2']])
+         nodes, edges = process_main(['doi1', 'doi2', 'doi3'],0,0,True)
+         doi_nodes = keep_only_dois(nodes)
+         self.assertCountEqual(doi_nodes, ['doi1','doi2', 'doi3'])
+         self.assertCountEqual(edges, [['doi3', 'doi1'], ['doi1', 'doi2']])
 
 
-     # def testInnerEdges(self):
-     #    nodes, edges = process_main(['doi_ie1'],1,1,True)
-     #    doi_nodes = keep_only_dois(nodes)
-     #    self.assertCountEqual(doi_nodes,['doi_ie1','doi_ie2','doi_ie3'])
-     #    self.assertCountEqual(edges,[['doi_ie1','doi_ie2'],['doi_ie3','doi_ie1'],['doi_ie3','doi_ie2']])
+     def testInnerEdges(self):
+        nodes, edges = process_main(['doi_ie1'],1,1,True)
+        doi_nodes = keep_only_dois(nodes)
+        self.assertCountEqual(doi_nodes,['doi_ie1','doi_ie2','doi_ie3'])
+        self.assertCountEqual(edges,[['doi_ie1','doi_ie2'],['doi_ie3','doi_ie1'],['doi_ie3','doi_ie2']])
      
-     # def testRightHeight(self):
-     #      nodes, edges = process_main(['doi_h01'],1,0,True)
-     #      doi_nodes = keep_only_dois(nodes)
-     #      self.assertCountEqual(doi_nodes,['doi_h01'])
-     #      self.assertCountEqual(edges, [])
-
-     #      nodes, edges = process_main(['doi_h02'],1,0,True)
-     #      doi_nodes = keep_only_dois(nodes)
-     #      self.assertCountEqual(doi_nodes,['doi_h02','doi_h1'])
-     #      self.assertCountEqual(edges, [['doi_h1','doi_h02']])
-
-     #      nodes, edges = process_main(['doi_h02'],2,0,True)
-     #      doi_nodes = keep_only_dois(nodes)
-     #      self.assertCountEqual(doi_nodes,['doi_h02','doi_h1','doi_h2'])
-     #      self.assertCountEqual(edges, [['doi_h1','doi_h02'], ['doi_h2','doi_h1']])
-
-     # def testRightDepth(self):
-     #      nodes, edges = process_main(['doi_d01'],0,1,True)
-     #      doi_nodes = keep_only_dois(nodes)
-     #      self.assertCountEqual(doi_nodes,['doi_d01'])
-     #      self.assertCountEqual(edges, [])
-
-     #      nodes, edges = process_main(['doi_d02'],0,1,True)
-     #      doi_nodes = keep_only_dois(nodes)
-     #      self.assertCountEqual(doi_nodes,['doi_d02','doi_d1'])
-     #      self.assertCountEqual(edges, [['doi_d02','doi_d1']])
-
-     #      nodes, edges = process_main(['doi_d02'],0,2,True)
-     #      doi_nodes = keep_only_dois(nodes)
-     #      self.assertCountEqual(doi_nodes,['doi_d02','doi_d1','doi_d2'])
-     #      self.assertCountEqual(edges, [['doi_d02','doi_d1'], ['doi_d1','doi_d2']])
-
-     # def test_import_from_json(self):
-     #      nodes_old, edges_old = process_main(['doi_lg_1_i'],2,2,True)
-     #      nodes_new, edges_new = input_from_json('test_output.json')
-     #      self.assertCountEqual(nodes_old,nodes_new)
-     #      self.assertCountEqual(edges_old, edges_new)
+     def testRightHeight(self):
+          nodes, edges = process_main(['doi_h01'],1,0,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_h01'])
+          self.assertCountEqual(edges, [])
+
+          nodes, edges = process_main(['doi_h02'],1,0,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_h02','doi_h1'])
+          self.assertCountEqual(edges, [['doi_h1','doi_h02']])
+
+          nodes, edges = process_main(['doi_h02'],2,0,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_h02','doi_h1','doi_h2'])
+          self.assertCountEqual(edges, [['doi_h1','doi_h02'], ['doi_h2','doi_h1']])
+
+     def testRightDepth(self):
+          nodes, edges = process_main(['doi_d01'],0,1,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_d01'])
+          self.assertCountEqual(edges, [])
+
+          nodes, edges = process_main(['doi_d02'],0,1,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_d02','doi_d1'])
+          self.assertCountEqual(edges, [['doi_d02','doi_d1']])
+
+          nodes, edges = process_main(['doi_d02'],0,2,True)
+          doi_nodes = keep_only_dois(nodes)
+          self.assertCountEqual(doi_nodes,['doi_d02','doi_d1','doi_d2'])
+          self.assertCountEqual(edges, [['doi_d02','doi_d1'], ['doi_d1','doi_d2']])
+
+     def test_import_from_json(self):
+          nodes_old, edges_old = process_main(['doi_lg_1_i'],2,2,True)
+          nodes_new, edges_new = input_from_json('test_output.json')
+          self.assertCountEqual(nodes_old,nodes_new)
+          self.assertCountEqual(edges_old, edges_new)
 
      def test_deleted_input_dois(self):
           nodes_old_single, edges_old_single = process_main(['doi_lg_1_i'],2,2,True)
diff --git a/verarbeitung/test/input_test.py b/verarbeitung/test/input_test.py
index 928c8b4..9efb376 100644
--- a/verarbeitung/test/input_test.py
+++ b/verarbeitung/test/input_test.py
@@ -14,11 +14,13 @@ def input_test_func(pub_doi):
 
     for array in list_of_arrays:
         if pub_doi == array[0]:
-            pub = Publication(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7])
+            pub = Publication(array[0], array[1], array[2], array[3], array[4], array[5], [], [])
+            pub.citations = cit(array[7], "Citation")
+            pub.references = cit(array[6], "Reference")
             return pub
 
 
-def cit(list_doi):
+def cit(list_doi, cit_type):
     '''
         :param list_doi list of citation dois to get their Citation Class 
         :type list_doi: List[String]
@@ -30,24 +32,9 @@ def cit(list_doi):
     for doi_url in list_doi:
         for array in list_of_arrays:
             if doi_url == array[0]:
-                cits.append(Citation(array[0], array[1], array[2], array[3], array[4]))
+                cits.append(Citation(array[0], array[1], array[2], array[3], cit_type))
     return cits
 
-def ref(list_doi):
-    '''
-        :param list_doi list of reference dois to get their Reference Class 
-        :type list_doi: List[String]
-
-        returns a list of reference objects for given doi list
-    '''
-
-    refs = []
-    for doi_url in list_doi:
-        for array in list_of_arrays:
-            if doi_url == array[0]:
-                refs.append(Citation(array[0], array[1], array[2], array[3], array[4]))
-    return refs
-
 
 
 beispiel1 = ['doi1', 'title1', ['contributor1'], 'journal1', 'date1', ['subject1'], ['doi2'], ['doi3']]
@@ -91,12 +78,13 @@ large_graph_2_h23 = ['doi_lg_2_h23', 'title_lg_2_h23', ['contributor_lg_2_h23'],
 large_graph_2_h24 = ['doi_lg_2_h24', 'title_lg_2_h24', ['contributor_lg_2_h24'], 'journal_lg_2_h24', 'date_lg_2_h24', ['subject_lg_2_h24'], ['doi_lg_2_h12','doi_lg_2_h23','doi_lg_2_d12'], ['doi_lg_2_h23']]
 large_graph_2_h11 = ['doi_lg_2_h11', 'title_lg_2_h11', ['contributor_lg_2_h11'], 'journal_lg_2_h11', 'date_lg_2_h11', ['subject_lg_2_h11'], ['doi_lg_2_i','doi_cg_i'], ['doi_lg_2_h21','doi_lg_2_h22']]
 large_graph_2_h12 = ['doi_lg_2_h12', 'title_lg_2_h12', ['contributor_lg_2_h12'], 'journal_lg_2_h12', 'date_lg_2_h12', ['subject_lg_2_h12'], ['doi_lg_2_i'], ['doi_lg_2_h23','doi_lg_2_h24']]
-large_graph_2_i =   ['doi_lg_2_i'  , 'title_lg_2_i'  , ['contributor_lg_2_i']  , 'journal_lg_2_i'  , 'date_lg_2_i'  , ['subject_lg_2_i']  , ['doi_lg_2_d11','doi_lg_2_d12'], ['doi_lg_2_h11','doi_lg_2_h12','doi_cg_i']]
-large_graph_2_d11 = ['doi_lg_2_d11', 'title_lg_2_d11', ['contributor_lg_2_d11'], 'journal_lg_2_d11', 'date_lg_2_d11', ['subject_lg_2_d11'], [], ['doi_lg_2_i']]
-large_graph_2_d12 = ['doi_lg_2_d12', 'title_lg_2_d12', ['contributor_lg_2_d12'], 'journal_lg_2_d12', 'date_lg_2_d12', ['subject_lg_2_d12'], ['doi_lg_2_d21','doi_lg_2_d22'], ['doi_lg_2_h24','doi_lg_2_i']]
-large_graph_2_d21 = ['doi_lg_2_d21', 'title_lg_2_d21', ['contributor_lg_2_d21'], 'journal_lg_2_d21', 'date_lg_2_d21', ['subject_lg_2_d21'], [], ['doi_lg_2_d12']]
+large_graph_2_i =   ['doi_lg_2_i'  , 'title_lg_2_i'  , ['contributor_lg_2_i']  , 'journal_lg_2_i'  , 'date_lg_2_i'  , ['subject_lg_2_i']  , ['doi_lg_2_d11','doi_lg_2_d12'], ['doi_lg_2_h11','doi_lg_2_h12','doi_cg_i','doi_lg_2_h11']]
+large_graph_2_d11 = ['doi_lg_2_d11', 'title_lg_2_d11', ['contributor_lg_2_d11'], 'journal_lg_2_d11', 'date_lg_2_d11', ['subject_lg_2_d11'], ['doi_lg_2_i','doi_lg_2_d21'], ['doi_lg_2_i']]
+large_graph_2_d12 = ['doi_lg_2_d12', 'title_lg_2_d12', ['contributor_lg_2_d12'], 'journal_lg_2_d12', 'date_lg_2_d12', ['subject_lg_2_d12'], ['doi_lg_2_d22','doi_lg_2_d23','doi_lg_2_d24'], ['doi_lg_2_h24','doi_lg_2_i']]
+large_graph_2_d21 = ['doi_lg_2_d21', 'title_lg_2_d21', ['contributor_lg_2_d21'], 'journal_lg_2_d21', 'date_lg_2_d21', ['subject_lg_2_d21'], [], ['doi_lg_2_d11']]
 large_graph_2_d22 = ['doi_lg_2_d22', 'title_lg_2_d22', ['contributor_lg_2_d22'], 'journal_lg_2_d22', 'date_lg_2_d22', ['subject_lg_2_d22'], [], ['doi_lg_2_d12']]
 large_graph_2_d23 = ['doi_lg_2_d23', 'title_lg_2_d23', ['contributor_lg_2_d23'], 'journal_lg_2_d23', 'date_lg_2_d23', ['subject_lg_2_d23'], [], ['doi_lg_2_d12']]
+large_graph_2_d24 = ['doi_lg_2_d24', 'title_lg_2_d24', ['contributor_lg_2_d24'], 'journal_lg_2_d24', 'date_lg_2_d24', ['subject_lg_2_d24'], [], ['doi_lg_2_d12']]
 
 crossed_graph_h21 = ['doi_cg_h21', 'title_cg_h21', ['contributor_cg_h21'], 'journal_cg_h21', 'date_cg_h21', ['subject_cg_h21'], ['doi_cg_h11'], []]
 crossed_graph_h22 = ['doi_cg_h22', 'title_cg_h22', ['contributor_cg_h22'], 'journal_cg_h22', 'date_cg_h22', ['subject_cg_h22'], ['doi_cg_h11'], []]
diff --git a/verarbeitung/test/test_graphs_plan.pdf b/verarbeitung/test/test_graphs_plan.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..c45b187bf3665e98fc84a4267bad2cbb9e3e64fa
GIT binary patch
literal 11174
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

literal 0
HcmV?d00001

diff --git a/verarbeitung/test_output.json b/verarbeitung/test_output.json
index e5a90e6..40a7bc5 100644
--- a/verarbeitung/test_output.json
+++ b/verarbeitung/test_output.json
@@ -1 +1 @@
-{"nodes": [{"doi": "doi_lg_1_i", "name": "title_lg_1_i", "author": ["contributor_lg_1_i"], "year": "date_lg_1_i", "journal": "journal_lg_1_i", "group": "Input", "depth": 0, "citations": 2}, {"doi": "doi_lg_1_d11", "name": "title_lg_1_d11", "author": ["contributor_lg_1_d11"], "year": "date_lg_1_d11", "journal": "journal_lg_1_d11", "group": "Reference", "depth": -1, "citations": 1}, {"doi": "doi_lg_1_d12", "name": "title_lg_1_d12", "author": ["contributor_lg_1_d12"], "year": "date_lg_1_d12", "journal": "journal_lg_1_d12", "group": "Reference", "depth": -1, "citations": 2}, {"doi": "doi_lg_1_h11", "name": "title_lg_1_h11", "author": ["contributor_lg_1_h11"], "year": "date_lg_1_h11", "journal": "journal_lg_1_h11", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_1_h12", "name": "title_lg_1_h12", "author": ["contributor_lg_1_h12"], "year": "date_lg_1_h12", "journal": "journal_lg_1_h12", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_2_i", "name": "title_lg_2_i", "author": ["contributor_lg_2_i"], "year": "date_lg_2_i", "journal": "journal_lg_2_i", "group": "Input", "depth": 0, "citations": 3}, {"doi": "doi_lg_2_d11", "name": "title_lg_2_d11", "author": ["contributor_lg_2_d11"], "year": "date_lg_2_d11", "journal": "journal_lg_2_d11", "group": "Reference", "depth": -1, "citations": 1}, {"doi": "doi_lg_2_d12", "name": "title_lg_2_d12", "author": ["contributor_lg_2_d12"], "year": "date_lg_2_d12", "journal": "journal_lg_2_d12", "group": "Reference", "depth": -1, "citations": 2}, {"doi": "doi_lg_2_h11", "name": "title_lg_2_h11", "author": ["contributor_lg_2_h11"], "year": "date_lg_2_h11", "journal": "journal_lg_2_h11", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_2_h12", "name": "title_lg_2_h12", "author": ["contributor_lg_2_h12"], "year": "date_lg_2_h12", "journal": "journal_lg_2_h12", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_cg_i", "name": "title_cg_i", "author": ["contributor_cg_i"], "year": "date_cg_i", "journal": "journal_cg_i", "group": "Citedby", "depth": 1, "citations": 3}, {"doi": "doi_lg_1_h21", "name": "title_lg_1_h21", "author": ["contributor_lg_1_h21"], "year": "date_lg_1_h21", "journal": "journal_lg_1_h21", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h22", "name": "title_lg_1_h22", "author": ["contributor_lg_1_h22"], "year": "date_lg_1_h22", "journal": "journal_lg_1_h22", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h23", "name": "title_lg_1_h23", "author": ["contributor_lg_1_h23"], "year": "date_lg_1_h23", "journal": "journal_lg_1_h23", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_2_h21", "name": "title_lg_2_h21", "author": ["contributor_lg_2_h21"], "year": "date_lg_2_h21", "journal": "journal_lg_2_h21", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_2_h22", "name": "title_lg_2_h22", "author": ["contributor_lg_2_h22"], "year": "date_lg_2_h22", "journal": "journal_lg_2_h22", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_2_h23", "name": "title_lg_2_h23", "author": ["contributor_lg_2_h23"], "year": "date_lg_2_h23", "journal": "journal_lg_2_h23", "group": "Citedby", "depth": 2, "citations": 1}, {"doi": "doi_lg_2_h24", "name": "title_lg_2_h24", "author": ["contributor_lg_2_h24"], "year": "date_lg_2_h24", "journal": "journal_lg_2_h24", "group": "Citedby", "depth": 2, "citations": 1}, {"doi": "doi_cg_h11", "name": "title_cg_h11", "author": ["contributor_cg_h11"], "year": "date_cg_h11", "journal": "journal_cg_h11", "group": "Citedby", "depth": 2, "citations": 2}, {"doi": "doi_lg_1_d21", "name": "title_lg_1_d21", "author": ["contributor_lg_1_d21"], "year": "date_lg_1_d21", "journal": "journal_lg_1_d21", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d22", "name": "title_lg_1_d22", "author": ["contributor_lg_1_d22"], "year": "date_lg_1_d22", "journal": "journal_lg_1_d22", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d23", "name": "title_lg_1_d23", "author": ["contributor_lg_1_d23"], "year": "date_lg_1_d23", "journal": "journal_lg_1_d23", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_2_d21", "name": "title_lg_2_d21", "author": ["contributor_lg_2_d21"], "year": "date_lg_2_d21", "journal": "journal_lg_2_d21", "group": "Reference", "depth": -2, "citations": 1}, {"doi": "doi_lg_2_d22", "name": "title_lg_2_d22", "author": ["contributor_lg_2_d22"], "year": "date_lg_2_d22", "journal": "journal_lg_2_d22", "group": "Reference", "depth": -2, "citations": 1}], "links": [{"source": "doi_lg_1_i", "target": "doi_lg_1_d11"}, {"source": "doi_lg_1_i", "target": "doi_lg_1_d12"}, {"source": "doi_lg_1_h11", "target": "doi_lg_1_i"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_i"}, {"source": "doi_lg_2_i", "target": "doi_lg_2_d11"}, {"source": "doi_lg_2_i", "target": "doi_lg_2_d12"}, {"source": "doi_lg_2_h11", "target": "doi_lg_2_i"}, {"source": "doi_lg_2_h12", "target": "doi_lg_2_i"}, {"source": "doi_cg_i", "target": "doi_lg_2_i"}, {"source": "doi_lg_1_h21", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h12"}, {"source": "doi_lg_1_h23", "target": "doi_lg_1_h12"}, {"source": "doi_lg_2_h21", "target": "doi_lg_2_h11"}, {"source": "doi_lg_2_h22", "target": "doi_lg_2_h11"}, {"source": "doi_lg_2_h23", "target": "doi_lg_2_h12"}, {"source": "doi_lg_2_h24", "target": "doi_lg_2_h12"}, {"source": "doi_lg_2_h24", "target": "doi_lg_2_h23"}, {"source": "doi_lg_2_h23", "target": "doi_lg_2_h24"}, {"source": "doi_lg_1_h23", "target": "doi_cg_i"}, {"source": "doi_cg_h11", "target": "doi_cg_i"}, {"source": "doi_lg_2_h11", "target": "doi_cg_i"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d21", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d22", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d12", "target": "doi_lg_1_d23"}, {"source": "doi_lg_2_d12", "target": "doi_lg_2_d21"}, {"source": "doi_lg_2_d12", "target": "doi_lg_2_d22"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_d12"}, {"source": "doi_lg_1_h11", "target": "doi_lg_1_h12"}, {"source": "doi_lg_2_h24", "target": "doi_lg_2_d12"}]}
\ No newline at end of file
+{"nodes": [{"doi": "doi_lg_1_i", "name": "title_lg_1_i", "author": ["contributor_lg_1_i"], "year": "date_lg_1_i", "journal": "journal_lg_1_i", "group": "Input", "depth": 0, "citations": 2}, {"doi": "doi_lg_1_d11", "name": "title_lg_1_d11", "author": ["contributor_lg_1_d11"], "year": "date_lg_1_d11", "journal": "journal_lg_1_d11", "group": "Reference", "depth": -1, "citations": 1}, {"doi": "doi_lg_1_d12", "name": "title_lg_1_d12", "author": ["contributor_lg_1_d12"], "year": "date_lg_1_d12", "journal": "journal_lg_1_d12", "group": "Reference", "depth": -1, "citations": 2}, {"doi": "doi_lg_1_h11", "name": "title_lg_1_h11", "author": ["contributor_lg_1_h11"], "year": "date_lg_1_h11", "journal": "journal_lg_1_h11", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_1_h12", "name": "title_lg_1_h12", "author": ["contributor_lg_1_h12"], "year": "date_lg_1_h12", "journal": "journal_lg_1_h12", "group": "Citedby", "depth": 1, "citations": 2}, {"doi": "doi_lg_1_h21", "name": "title_lg_1_h21", "author": ["contributor_lg_1_h21"], "year": "date_lg_1_h21", "journal": "journal_lg_1_h21", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h22", "name": "title_lg_1_h22", "author": ["contributor_lg_1_h22"], "year": "date_lg_1_h22", "journal": "journal_lg_1_h22", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_h23", "name": "title_lg_1_h23", "author": ["contributor_lg_1_h23"], "year": "date_lg_1_h23", "journal": "journal_lg_1_h23", "group": "Citedby", "depth": 2, "citations": 0}, {"doi": "doi_lg_1_d21", "name": "title_lg_1_d21", "author": ["contributor_lg_1_d21"], "year": "date_lg_1_d21", "journal": "journal_lg_1_d21", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d22", "name": "title_lg_1_d22", "author": ["contributor_lg_1_d22"], "year": "date_lg_1_d22", "journal": "journal_lg_1_d22", "group": "Reference", "depth": -2, "citations": 2}, {"doi": "doi_lg_1_d23", "name": "title_lg_1_d23", "author": ["contributor_lg_1_d23"], "year": "date_lg_1_d23", "journal": "journal_lg_1_d23", "group": "Reference", "depth": -2, "citations": 2}], "links": [{"source": "doi_lg_1_i", "target": "doi_lg_1_d11"}, {"source": "doi_lg_1_i", "target": "doi_lg_1_d12"}, {"source": "doi_lg_1_h11", "target": "doi_lg_1_i"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_i"}, {"source": "doi_lg_1_h21", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h11"}, {"source": "doi_lg_1_h22", "target": "doi_lg_1_h12"}, {"source": "doi_lg_1_h23", "target": "doi_lg_1_h12"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d11", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d21", "target": "doi_lg_1_d22"}, {"source": "doi_lg_1_d22", "target": "doi_lg_1_d21"}, {"source": "doi_lg_1_d12", "target": "doi_lg_1_d23"}, {"source": "doi_lg_1_h12", "target": "doi_lg_1_d12"}, {"source": "doi_lg_1_h11", "target": "doi_lg_1_h12"}]}
\ No newline at end of file
diff --git a/verarbeitung/update_graph/update_graph_del.py b/verarbeitung/update_graph/update_graph_del.py
index c371e0c..eaa25d6 100644
--- a/verarbeitung/update_graph/update_graph_del.py
+++ b/verarbeitung/update_graph/update_graph_del.py
@@ -29,10 +29,15 @@ def delete_ref_nodes_rec(pub):
     '''
     for reference in pub.references:
         for ref_pub in processed_list:
-            if (ref_pub.doi_url == reference):
+            if (ref_pub.doi_url == reference.doi_url):
                 
                 # to find a cyclus and avoid recursion error
-                if (reference not in pub.citations):
+                not_in_citations = True
+                for citation in pub.citations:
+                    if (reference.doi_url == citation.doi_url):
+                        not_in_citations = False
+                        break
+                if (not_in_citations):  
                     delete_ref_nodes_rec(ref_pub)
 
     # removes publication from list after recursion and if it's not of group input
@@ -49,10 +54,15 @@ def delete_cit_nodes_rec(pub):
     '''
     for citation in pub.citations:
         for cit_pub in processed_list:
-            if (cit_pub.doi_url == citation):
+            if (cit_pub.doi_url == citation.doi_url):
 
                 # to find a cyclus and avoid recursion error
-                if (citation not in pub.references):
+                not_in_references = True
+                for reference in pub.references:
+                    if (citation.doi_url == reference.doi_url):
+                        not_in_references = False
+                        break
+                if (not_in_references):  
                     delete_cit_nodes_rec(cit_pub)
 
     # removes publication from list after recursion and if it's not of group input               
-- 
GitLab