def get_neighborhood(self, ids, radius=1, full_subgraph=True):
        """
        Retrieve the graph neighborhood around a set of vertices, ignoring edge
        directions. Note that setting radius greater than two often results in a
        time-consuming query for a very large subgraph.

        Parameters
        ----------
        ids : list [int | float | str]
            List of target vertex IDs.

        radius : int, optional
            Radius of the neighborhood. Every vertex in the returned subgraph is
            reachable from at least one of the target vertices on a path of
            length no longer than ``radius``. Setting radius larger than 2 may
            result in a very large subgraph.

        full_subgraph : bool, optional
            If True, return all edges between vertices in the returned
            neighborhood. The result is also known as the subgraph induced by
            the target nodes' neighbors, or the egocentric network for the
            target nodes. If False, return only edges on paths of length <=
            ``radius`` from the target node, also known as the reachability
            graph.

        Returns
        -------
        out : Graph
            The subgraph with the neighborhoods around the target vertices.

        See Also
        --------
        get_edges, get_vertices

        References
        ----------
        - Marsden, P. (2002) `Egocentric and sociocentric measures of network
          centrality <http://www.sciencedirect.com/science/article/pii/S03788733
          02000163>`_.
        - `Wikipedia - Reachability <http://en.wikipedia.org/wiki/Reachability>`_

        Examples
        --------
        >>> sf_edge = turicreate.SFrame({'source': range(9), 'dest': range(1, 10)})
        >>> g = turicreate.SGraph()
        >>> g = g.add_edges(sf_edge, src_field='source', dst_field='dest')
        >>> subgraph = g.get_neighborhood(ids=[1, 7], radius=2,
                                          full_subgraph=True)
        """


        verts = ids

        ## find the vertices within radius (and the path edges)
        for i in range(radius):
            edges_out = self.get_edges(src_ids=verts)
            edges_in = self.get_edges(dst_ids=verts)

            verts = list(edges_in['__src_id']) + list(edges_in['__dst_id']) + \
                list(edges_out['__src_id']) + list(edges_out['__dst_id'])
            verts = list(set(verts))

        ## make a new graph to return and add the vertices
        g = SGraph()
        g = g.add_vertices(self.get_vertices(verts), vid_field='__id')

        ## add the requested edge set
        if full_subgraph is True:
            induced_edge_out = self.get_edges(src_ids=verts)
            induced_edge_in = self.get_edges(dst_ids=verts)
            df_induced = induced_edge_out.append(induced_edge_in)
            df_induced = df_induced.groupby(df_induced.column_names(), {})

            verts_sa = SArray(list(verts))
            edges = df_induced.filter_by(verts_sa, "__src_id")
            edges = edges.filter_by(verts_sa, "__dst_id")

        else:
            path_edges = edges_out.append(edges_in)
            edges = path_edges.groupby(path_edges.column_names(), {})

        g = g.add_edges(edges, src_field='__src_id', dst_field='__dst_id')
        return g
Retrieve the graph neighborhood around a set of vertices, ignoring edge
        directions. Note that setting radius greater than two often results in a
        time-consuming query for a very large subgraph.

        Parameters
        ----------
        ids : list [int | float | str]
            List of target vertex IDs.

        radius : int, optional
            Radius of the neighborhood. Every vertex in the returned subgraph is
            reachable from at least one of the target vertices on a path of
            length no longer than ``radius``. Setting radius larger than 2 may
            result in a very large subgraph.

        full_subgraph : bool, optional
            If True, return all edges between vertices in the returned
            neighborhood. The result is also known as the subgraph induced by
            the target nodes' neighbors, or the egocentric network for the
            target nodes. If False, return only edges on paths of length <=
            ``radius`` from the target node, also known as the reachability
            graph.

        Returns
        -------
        out : Graph
            The subgraph with the neighborhoods around the target vertices.

        See Also
        --------
        get_edges, get_vertices

        References
        ----------
        - Marsden, P. (2002) `Egocentric and sociocentric measures of network
          centrality <http://www.sciencedirect.com/science/article/pii/S03788733
          02000163>`_.
        - `Wikipedia - Reachability <http://en.wikipedia.org/wiki/Reachability>`_

        Examples
        --------
        >>> sf_edge = turicreate.SFrame({'source': range(9), 'dest': range(1, 10)})
        >>> g = turicreate.SGraph()
        >>> g = g.add_edges(sf_edge, src_field='source', dst_field='dest')
        >>> subgraph = g.get_neighborhood(ids=[1, 7], radius=2,
                                          full_subgraph=True)