From cbfde4b951c458c61663f20ce78bdcb2de3722c4 Mon Sep 17 00:00:00 2001 From: DerekFurstPitt Date: Tue, 7 Jan 2025 15:59:36 -0500 Subject: [PATCH 1/2] updated prov to version 2.0.1. Modified neo4j query to return only certain fields for get_provenance, particularly omitting expensive ones like files and metadata --- src/app_neo4j_queries.py | 8 +++++++- src/requirements.txt | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app_neo4j_queries.py b/src/app_neo4j_queries.py index bd116c6e..85d4f09c 100644 --- a/src/app_neo4j_queries.py +++ b/src/app_neo4j_queries.py @@ -580,7 +580,13 @@ def get_provenance(neo4j_driver, uuid, depth): f"WHERE n.uuid = '{uuid}' " f"CALL apoc.path.subgraphAll(n, {{ {max_level_str} relationshipFilter:' Date: Fri, 10 Jan 2025 17:19:23 -0500 Subject: [PATCH 2/2] added hubmap_id to activities for get provenance. Reworked the code so that it is less hard coded and the query values are generated from lists to reduce sources of errors and improve readability --- src/app_neo4j_queries.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app_neo4j_queries.py b/src/app_neo4j_queries.py index 85d4f09c..602444f3 100644 --- a/src/app_neo4j_queries.py +++ b/src/app_neo4j_queries.py @@ -574,7 +574,13 @@ def get_provenance(neo4j_driver, uuid, depth): max_level_str = '' if depth is not None and len(str(depth)) > 0: max_level_str = f"maxLevel: {depth}, " - + delimiter = ', ' + entity_properties = ['group_uuid', 'created_by_user_displayname', 'created_by_user_sub', 'created_by_user_email', 'uuid', 'dataset_type', 'hubmap_id', 'entity_type', 'status', 'created_timestamp'] + activity_properties = ['hubmap_id', 'created_by_user_displayname', 'created_by_user_sub', 'created_by_user_email', 'creation_action', 'uuid', 'status', 'created_timestamp'] + entity_cypher_pairs_list = [f'{prop}: node.{prop}' for prop in entity_properties] + activity_cypher_pairs_list = [f'{prop}: node.{prop}' for prop in activity_properties] + entity_cypher_pairs_string = delimiter.join(entity_cypher_pairs_list) + activity_cypher_pairs_string = delimiter.join(activity_cypher_pairs_list) # More info on apoc.path.subgraphAll() procedure: https://neo4j.com/labs/apoc/4.0/graph-querying/expand-subgraph/ query = (f"MATCH (n:Entity) " f"WHERE n.uuid = '{uuid}' " @@ -582,8 +588,8 @@ def get_provenance(neo4j_driver, uuid, depth): f"YIELD nodes, relationships " f"WITH [node in nodes | " f" CASE " - f" WHEN 'Activity' IN labels(node) THEN node {{ created_by_user_displayname: node.created_by_user_displayname, created_by_user_sub: node.created_by_user_sub, created_by_user_email: node.created_by_user_email, creation_action: node.creation_action, uuid: node.uuid, status: node.status, created_timestamp: node.created_timestamp, label: labels(node)[0] }} " - f" WHEN 'Entity' IN labels(node) THEN node {{ group_uuid: node.group_uuid, created_by_user_displayname: node.created_by_user_displayname, created_by_user_sub: node.created_by_user_sub, created_by_user_email: node.created_by_user_email, uuid: node.uuid, dataset_type: node.dataset_type, hubmap_id: node.hubmap_id, entity_type: node.entity_type, status: node.status, created_timestamp: node.created_timestamp, label: labels(node)[0] }} " + f" WHEN 'Activity' IN labels(node) THEN node {{{activity_cypher_pairs_string} , label: labels(node)[0] }} " + f" WHEN 'Entity' IN labels(node) THEN node {{{entity_cypher_pairs_string} , label: labels(node)[0] }} " f" ELSE node {{ label: labels(node)[0] }} " f" END " f"] as nodes, "