"""Helper methods for querying neo4j.""" from participant.connectors import neo4j from participant.utils.convert import node_to_dict def get_node(query, **kwargs): """Get a node by running a query.""" return _single_node_query(query, **kwargs) def create_node(query, **kwargs): """Create a node by running a query.""" return _single_node_query(query, **kwargs) def update_node(query, **kwargs): """Update a node by running a query.""" return _single_node_query(query, **kwargs) def get_nodes(query, **kwargs): """Get multiple nodes by running a query.""" with neo4j.db_session() as session: results = session.run(query, **kwargs) data = [] if results is not None: for record in results: data.append(node_to_dict(record.get('node'))) return data def get_records(query, **kwargs): """Get multiple records by running a query. Use when the query is selecting specific fields/attributes, not nodes. """ with neo4j.db_session() as session: results = session.run(query, **kwargs) data = [] if results is not None: for record in results: data.append(node_to_dict(record)) return data def get_nodes_and_relationship(query, **kwargs): """Get multiple nodes and their relationship by running a query.""" with neo4j.db_session() as session: results = session.run(query, **kwargs) data = [] if results is not None: for record in results.data(): node = node_to_dict(record.get('node')) relationship = node_to_dict(record.get('r')[0]) data.append((node, relationship)) return data def create_relationship(query, **kwargs): """Create a relationship by running a query.""" return _single_relationship_query(query, **kwargs) def update_relationship(query, **kwargs): """Update a relationship by running a query.""" return _single_relationship_query(query, **kwargs) def delete_relationship(query, **kwargs): """Delete a relationship by running a query.""" return _single_relationship_query(query, **kwargs) def _single_node_query(query, **kwargs): """Update a node by running a query.""" with neo4j.db_session() as session: result = session.run(query, **kwargs).single() if not result or not result.get('node'): return None return result.get('node') def _single_relationship_query(query, **kwargs): """Update a relationship by running a query.""" with neo4j.db_session() as session: result = session.run(query, **kwargs).single() if not result or not result.get('r'): return None formatted_result = { 'type': result['r'].type, 'properties': [], } for key, value in result['r'].items(): formatted_result['properties'].append( { 'name': key, 'value': value, } ) return formatted_result