def query_network(self, uuid, search_string, max_edges): myConst = CX_CONSTANTS niceCx = NiceCXNetwork() #uuid = '7246d8cf-c644-11e6-b48c-0660b7976219' search_terms_dict = {k:1 for k in search_string.split(',')} solr = pysolr.Solr(solr_url + uuid + '/', timeout=10) try: results = solr.search(search_string, rows=10000) #search_terms_array = [int(n['id']) for n in results.docs] search_terms_array = {int(n['id']):1 for n in results.docs} if(not search_terms_array): return {'message': 'No nodes found'} print('starting nodes 1') #=================== # METADATA #=================== available_aspects = [] for ae in (o for o in self.stream_aspect(uuid, 'metaData')): available_aspects.append(ae.get(CX_CONSTANTS.METADATA_NAME)) mde = MetaDataElement(json_obj=ae) niceCx.add_metadata(mde) #available_aspects = ['edges', 'nodes'] # TODO - remove this opaque_aspects = set(available_aspects).difference(known_aspects_min) print(opaque_aspects) #=================== # NODES #=================== if 'nodes' in available_aspects: for ae in (o for o in self.stream_aspect(uuid, 'nodes')): if search_terms_array.get(ae.get(CX_CONSTANTS.ID)): add_this_node = NodeElement(cx_fragment=ae) niceCx.create_node(add_this_node) else: raise Exception('Network does not contain any nodes. Cannot query') print('starting edges 1') #=================== # EDGES #=================== edge_count = 0 added_edges = 0 start_time = time.time() if 'edges' in available_aspects: for ae in (o for o in self.stream_aspect(uuid, 'edges')): if niceCx.nodes.get(ae.get(CX_CONSTANTS.EDGE_SOURCE_NODE_ID_OR_SUBNETWORK)) is not None or niceCx.nodes.get(ae.get(CX_CONSTANTS.EDGE_TARGET_NODE_ID)) is not None: add_this_edge = EdgeElement(cx_fragment=ae) niceCx.create_edge(add_this_edge) added_edges += 1 if edge_count % 5000 == 0: print(edge_count) #if edge_count > 30000: # break if added_edges > max_edges: raise StopIteration('Max edges reached') edge_count += 1 else: raise Exception('Network does not contain any nodes. Cannot query') print('Response time (Edge search): ' + str(time.time() - start_time)) print('starting nodes 2') #=================== # NODES #=================== for ae in (o for o in self.stream_aspect(uuid, 'nodes')): if niceCx.get_missing_nodes().get(ae.get(CX_CONSTANTS.ID)): add_this_node = NodeElement(cx_fragment=ae) niceCx.create_node(add_this_node) #==================== # NETWORK ATTRIBUTES #==================== if 'networkAttributes' in available_aspects: for ae in (o for o in self.stream_aspect(uuid, 'networkAttributes')): add_this_network_attribute = NetworkAttributesElement(cx_fragment=ae) niceCx.add_network_attribute(add_this_network_attribute) #=================== # NODE ATTRIBUTES #=================== if 'nodeAttributes' in available_aspects: for ae in (o for o in self.stream_aspect(uuid, 'nodeAttributes')): if niceCx.nodes.get(ae.get(CX_CONSTANTS.PROPERTY_OF)): add_this_node_att = NodeAttributesElement(json_obj=ae) niceCx.add_node_attribute(add_this_node_att) #=================== # EDGE ATTRIBUTES #=================== if 'edgeAttributes' in available_aspects: for ae in (o for o in self.stream_aspect(uuid, 'edgeAttributes')): if niceCx.edges.get(ae.get(CX_CONSTANTS.PROPERTY_OF)): add_this_edge_att = EdgeAttributesElement(json_obj=ae) niceCx.set_edge_attribute() #=================== # NODE CITATIONS #=================== if 'nodeCitations' in available_aspects: for ae in (o for o in self.stream_aspect(uuid, 'nodeCitations')): for e_po in ae.get(CX_CONSTANTS.PROPERTY_OF): if niceCx.get_nodes().get(e_po) is not None: niceCx.add_node_citations_from_cx(ae) #=================== # EDGE CITATIONS #=================== ec_count = 0 if 'edgeCitations' in available_aspects: for ae in (o for o in self.stream_aspect(uuid, 'edgeCitations')): for e_po in ae.get(CX_CONSTANTS.PROPERTY_OF): if niceCx.get_edges().get(e_po) is not None: niceCx.add_edge_citations_from_cx(ae) ec_count += 1 if ec_count % 500 == 0: print(ec_count) #=================== # CITATIONS #=================== if 'citations' in available_aspects: #====================================================== # FILTER CITATIONS IF THERE ARE EDGE OR NODE CITATIONS # OTHERWISE ADD THEM ALL (NO-FILTER) -- TODO #====================================================== for ae in (o for o in self.stream_aspect(uuid, 'citations')): add_this_citation = CitationElement(cx_fragment=ae) niceCx.add_citation(add_this_citation) #=================== # OPAQUE ASPECTS #=================== for oa in opaque_aspects: objects = self.stream_aspect(uuid, oa) obj_items = (o for o in objects) for oa_item in obj_items: aspect_element = AspectElement(oa_item, oa) niceCx.add_opaque_aspect(aspect_element) except SolrError as se: if('404' in se.message): ndex2.get_logger('SOLR').warning('Network not found ' + self.uuid + ' on ' + solr_url + ' server.') raise Exception("Network not found (SOLR)") else: ndex2.get_logger('SOLR').warning('Network error ' + self.uuid + ' on ' + solr_url + ' server. ' + se.message) raise Exception(se.message) except StopIteration as si: ndex2.get_logger('QUERY').warning("Found more than max edges. Raising exception") raise StopIteration(si.message) #nice_cx_json = niceCx.to_cx() return niceCx
def create_nice_cx_from_networkx(G): """ Create a NiceCXNetwork based on a networkx graph. The resulting NiceCXNetwork contains the nodes edges and their attributes from the networkx graph and also preserves the graph 'pos' attribute as a CX cartesian coordinates aspect. :param G: networkx graph :type G: networkx graph :return: NiceCXNetwork :rtype: NiceCXNetwork """ if G is None: raise Exception('Networkx input is empty') my_nicecx = NiceCXNetwork() if G.graph.get('name'): my_nicecx.set_name(G.graph.get('name')) else: my_nicecx.set_name('created from networkx') my_nicecx.add_metadata_stub('networkAttributes') for n, d in G.nodes_iter(data=True): # ============= # ADD NODES # ============= if d and d.get('name'): my_nicecx.create_node(id=n, node_name=d.get('name'), node_represents=d.get('name')) else: my_nicecx.create_node(id=n, node_name=n, node_represents=n) # ====================== # ADD NODE ATTRIBUTES # ====================== for k, v in d.items(): attr_type = None if isinstance(v, float): attr_type = ATTRIBUTE_DATA_TYPE.FLOAT elif isinstance(v, int): attr_type = ATTRIBUTE_DATA_TYPE.INTEGER my_nicecx.set_node_attribute(n, k, v, type=attr_type) index = 0 for u, v, d in G.edges_iter(data=True): # ============= # ADD EDGES # ============= my_nicecx.create_edge(id=index, edge_source=u, edge_target=v, edge_interaction=d.get('interaction')) # ============================== # ADD EDGE ATTRIBUTES # ============================== for k, val in d.items(): if k != 'interaction': attr_type = None if isinstance(val, float): attr_type = ATTRIBUTE_DATA_TYPE.FLOAT elif isinstance(val, int): attr_type = ATTRIBUTE_DATA_TYPE.INTEGER my_nicecx.set_edge_attribute(index, k, val, type=attr_type) index += 1 my_nicecx.add_metadata_stub('nodes') my_nicecx.add_metadata_stub('edges') if my_nicecx.nodeAttributes: my_nicecx.add_metadata_stub('nodeAttributes') if my_nicecx.edgeAttributes: my_nicecx.add_metadata_stub('edgeAttributes') if hasattr(G, 'pos'): aspect = _create_cartesian_coordinates_aspect_from_networkx(G) my_nicecx.add_opaque_aspect('cartesianLayout', aspect) my_nicecx.add_metadata_stub('cartesianLayout') return my_nicecx
def create_nice_cx_from_server(server=None, username=None, password=None, uuid=None): if server and uuid: my_nicecx = NiceCXNetwork() #=================== # METADATA #=================== available_aspects = [] md_aspect_iter = my_nicecx.get_aspect(uuid, 'metaData', server, username, password) if md_aspect_iter: for ae in (o for o in md_aspect_iter): available_aspects.append(ae.get(CX_CONSTANTS.METADATA_NAME)) mde = MetaDataElement(cx_fragment=ae) my_nicecx.add_metadata(mde) else: if not username or not password: raise Exception( 'Network is not available. Username and/or password not supplied' ) else: raise Exception('Network not available') opaque_aspects = set(available_aspects).difference(known_aspects_min) #==================== # NETWORK ATTRIBUTES #==================== if 'networkAttributes' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'networkAttributes', server, username, password) for network_item in objects: my_nicecx.add_network_attribute(json_obj=network_item) my_nicecx.add_metadata_stub('networkAttributes') #=================== # NODES #=================== if 'nodes' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'nodes', server, username, password) for node_item in objects: my_nicecx.create_node(cx_fragment=node_item) my_nicecx.add_metadata_stub('nodes') #=================== # EDGES #=================== if 'edges' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'edges', server, username, password) for edge_item in objects: my_nicecx.create_edge(cx_fragment=edge_item) my_nicecx.add_metadata_stub('edges') #=================== # NODE ATTRIBUTES #=================== if 'nodeAttributes' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'nodeAttributes', server, username, password) for att in objects: #my_nicecx.set_node_attribute(att.get('po'), att.get('n'), att.get('v'), type=att.get('d')) node_attribute_element = NodeAttributesElement(cx_fragment=att) my_nicecx.nodeAttributeHeader.add( node_attribute_element.get_name()) nodeAttrs = my_nicecx.nodeAttributes.get( node_attribute_element.get_property_of()) if nodeAttrs is None: nodeAttrs = [] my_nicecx.nodeAttributes[ node_attribute_element.get_property_of()] = nodeAttrs nodeAttrs.append(node_attribute_element) my_nicecx.add_metadata_stub('nodeAttributes') #=================== # EDGE ATTRIBUTES #=================== if 'edgeAttributes' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'edgeAttributes', server, username, password) for att in objects: edge_attribute_element = EdgeAttributesElement(cx_fragment=att) my_nicecx.edgeAttributeHeader.add( edge_attribute_element.get_name()) edge_attrs = my_nicecx.edgeAttributes.get(att.get('po')) if edge_attrs is None: edge_attrs = [] my_nicecx.edgeAttributes[ edge_attribute_element.get_property_of()] = edge_attrs edge_attrs.append(edge_attribute_element) my_nicecx.add_metadata_stub('edgeAttributes') #=================== # CITATIONS #=================== if 'citations' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'citations', server, username, password) for cit in objects: aspect_element = AspectElement(cit, 'citations') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('citations') #=================== # SUPPORTS #=================== if 'supports' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'supports', server, username, password) for sup in objects: aspect_element = AspectElement(sup, 'supports') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('supports') #=================== # EDGE SUPPORTS #=================== if 'edgeSupports' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'edgeSupports', server, username, password) for add_this_edge_sup in objects: aspect_element = AspectElement(add_this_edge_sup, 'edgeSupports') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('edgeSupports') #=================== # NODE CITATIONS #=================== if 'nodeCitations' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'nodeCitations', server, username, password) for node_cit in objects: aspect_element = AspectElement(node_cit, 'nodeCitations') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('nodeCitations') #=================== # EDGE CITATIONS #=================== if 'edgeCitations' in available_aspects: objects = my_nicecx.get_aspect(uuid, 'edgeCitations', server, username, password) for edge_cit in objects: aspect_element = AspectElement(edge_cit, 'edgeCitations') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('edgeCitations') #=================== # OPAQUE ASPECTS #=================== for oa in opaque_aspects: objects = my_nicecx.get_aspect(uuid, oa, server, username, password) for oa_item in objects: aspect_element = AspectElement(oa_item, oa) my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub(oa) else: raise Exception('Server and uuid not specified') return my_nicecx
def create_from_server(self, server, username, password, uuid): if server and uuid: niceCx = NiceCXNetwork() #=================== # METADATA #=================== available_aspects = [] for ae in (o for o in self.stream_aspect(uuid, 'metaData')): available_aspects.append(ae.get(CX_CONSTANTS.METADATA_NAME)) mde = MetaDataElement(json_obj=ae) niceCx.add_metadata(mde) #available_aspects = ['edges', 'nodes'] # TODO - remove this opaque_aspects = set(available_aspects).difference( known_aspects_min) print(opaque_aspects) #==================== # NETWORK ATTRIBUTES #==================== objects = self.stream_aspect(uuid, 'networkAttributes') obj_items = (o for o in objects) for network_item in obj_items: add_this_network_attribute = NetworkAttributesElement( cx_fragment=network_item) niceCx.add_network_attribute(add_this_network_attribute) #=================== # NODES #=================== objects = self.stream_aspect(uuid, 'nodes') obj_items = (o for o in objects) for node_item in obj_items: add_this_node = NodeElement(cx_fragment=node_item) niceCx.create_node(add_this_node) #=================== # EDGES #=================== objects = self.stream_aspect(uuid, 'edges') obj_items = (o for o in objects) for edge_item in obj_items: add_this_edge = EdgeElement(cx_fragment=edge_item) niceCx.create_edge(add_this_edge) #=================== # NODE ATTRIBUTES #=================== objects = self.stream_aspect(uuid, 'nodeAttributes') obj_items = (o for o in objects) for att in obj_items: add_this_node_att = NodeAttributesElement(json_obj=att) niceCx.add_node_attribute(add_this_node_att) #=================== # EDGE ATTRIBUTES #=================== objects = self.stream_aspect(uuid, 'edgeAttributes') obj_items = (o for o in objects) for att in obj_items: add_this_edge_att = EdgeAttributesElement(json_obj=att) niceCx.add_edge_attribute(add_this_edge_att) #=================== # CITATIONS #=================== objects = self.stream_aspect(uuid, 'citations') obj_items = (o for o in objects) for cit in obj_items: add_this_citation = CitationElement(cx_fragment=cit) niceCx.add_citation(add_this_citation) #=================== # SUPPORTS #=================== objects = self.stream_aspect(uuid, 'supports') obj_items = (o for o in objects) for sup in obj_items: add_this_supports = SupportElement(cx_fragment=sup) niceCx.add_support(add_this_supports) #=================== # NODE CITATIONS #=================== objects = self.stream_aspect(uuid, 'nodeCitations') obj_items = (o for o in objects) for node_cit in obj_items: niceCx.add_node_citations_from_cx(node_cit) #=================== # EDGE CITATIONS #=================== objects = self.stream_aspect(uuid, 'edgeCitations') obj_items = (o for o in objects) for edge_cit in obj_items: niceCx.add_edge_citations_from_cx(edge_cit) #=================== # OPAQUE ASPECTS #=================== for oa in opaque_aspects: objects = self.stream_aspect(uuid, oa) obj_items = (o for o in objects) for oa_item in obj_items: aspect_element = AspectElement(oa_item, oa) niceCx.add_opaque_aspect(aspect_element) return niceCx else: raise Exception('Server and uuid not specified')
def create_nice_cx_from_cx(cx): my_nicecx = NiceCXNetwork() if cx: #=================== # METADATA #=================== available_aspects = [] for ae in ( o for o in my_nicecx.get_frag_from_list_by_key(cx, 'metaData')): available_aspects.append(ae.get(CX_CONSTANTS.METADATA_NAME)) mde = MetaDataElement(cx_fragment=ae) my_nicecx.add_metadata(mde) opaque_aspects = set(available_aspects).difference(known_aspects_min) #==================== # NETWORK ATTRIBUTES #==================== if 'networkAttributes' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key( cx, 'networkAttributes') for network_item in objects: add_this_network_attribute = NetworkAttributesElement( cx_fragment=network_item) my_nicecx.add_network_attribute( network_attribute_element=add_this_network_attribute) my_nicecx.add_metadata_stub('networkAttributes') #=================== # NODES #=================== if 'nodes' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'nodes') for node_item in objects: my_nicecx.create_node(cx_fragment=node_item) my_nicecx.add_metadata_stub('nodes') #=================== # EDGES #=================== if 'edges' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'edges') for edge_item in objects: my_nicecx.create_edge(cx_fragment=edge_item) my_nicecx.add_metadata_stub('edges') #=================== # NODE ATTRIBUTES #=================== if 'nodeAttributes' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'nodeAttributes') for att in objects: #my_nicecx.set_node_attribute(None, None, None, cx_fragment=att) node_attribute_element = NodeAttributesElement(cx_fragment=att) my_nicecx.nodeAttributeHeader.add( node_attribute_element.get_name()) nodeAttrs = my_nicecx.nodeAttributes.get( node_attribute_element.get_property_of()) if nodeAttrs is None: nodeAttrs = [] my_nicecx.nodeAttributes[ node_attribute_element.get_property_of()] = nodeAttrs nodeAttrs.append(node_attribute_element) my_nicecx.add_metadata_stub('nodeAttributes') #=================== # EDGE ATTRIBUTES #=================== if 'edgeAttributes' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'edgeAttributes') for att in objects: #my_nicecx.set_edge_attribute(None, None, None, cx_fragment=att) edge_attribute_element = EdgeAttributesElement(cx_fragment=att) my_nicecx.edgeAttributeHeader.add( edge_attribute_element.get_name()) edge_attrs = my_nicecx.edgeAttributes.get(att.get('po')) if edge_attrs is None: edge_attrs = [] my_nicecx.edgeAttributes[ edge_attribute_element.get_property_of()] = edge_attrs edge_attrs.append(edge_attribute_element) my_nicecx.add_metadata_stub('edgeAttributes') #=================== # CITATIONS #=================== if 'citations' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'citations') for cit in objects: aspect_element = AspectElement(cit, 'citations') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('citations') #=================== # SUPPORTS #=================== if 'supports' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'supports') for sup in objects: aspect_element = AspectElement(sup, 'supports') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('supports') #=================== # EDGE SUPPORTS #=================== if 'edgeSupports' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'edgeSupports') for add_this_edge_sup in objects: aspect_element = AspectElement(add_this_edge_sup, 'edgeSupports') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('edgeSupports') #=================== # NODE CITATIONS #=================== if 'nodeCitations' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'nodeCitations') for node_cit in objects: aspect_element = AspectElement(node_cit, 'nodeCitations') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('nodeCitations') #=================== # EDGE CITATIONS #=================== if 'edgeCitations' in available_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, 'edgeCitations') for edge_cit in objects: aspect_element = AspectElement(edge_cit, 'edgeCitations') my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub('edgeCitations') #=================== # OPAQUE ASPECTS #=================== for oa in opaque_aspects: objects = my_nicecx.get_frag_from_list_by_key(cx, oa) for oa_item in objects: aspect_element = AspectElement(oa_item, oa) my_nicecx.add_opaque_aspect(aspect_element) my_nicecx.add_metadata_stub(oa) return my_nicecx else: raise Exception('CX is empty')