예제 #1
0
    def gremlin(self, graph):
        """Get a interactive engine handler to execute gremlin queries.

        Args:
            graph: :class:`Graph`

        Raises:
            InvalidArgumentError: :code:`graph` is not a property graph or unloaded.

        Returns:
            :class:`InteractiveQuery`
        """
        if (graph.vineyard_id in self._interactive_instance_dict
                and self._interactive_instance_dict[graph.vineyard_id]
                is not None):
            return self._interactive_instance_dict[graph.vineyard_id]

        if not graph.loaded():
            raise InvalidArgumentError("The graph has already been unloaded")
        if not graph.graph_type == types_pb2.ARROW_PROPERTY:
            raise InvalidArgumentError("The graph should be a property graph.")

        from graphscope.interactive.query import InteractiveQuery

        response = self._grpc_client.create_interactive_engine(
            graph.vineyard_id, graph.schema_path)
        interactive_query = InteractiveQuery(
            graphscope_session=self,
            object_id=graph.vineyard_id,
            front_ip=response.frontend_host,
            front_port=response.frontend_port,
        )
        self._interactive_instance_dict[graph.vineyard_id] = interactive_query
        graph.attach_interactive_instance(interactive_query)
        return interactive_query
예제 #2
0
    def gremlin(self, graph, engine_params=None):
        """Get a interactive engine handler to execute gremlin queries.

        Args:
            graph (:class:`Graph`): Use the graph to create interactive instance.
            engine_params (dict, optional): Configure startup parameters of interactive engine.
                See a list of configurable keys in
                `interactive_engine/deploy/docker/dockerfile/executor.vineyard.properties`

        Raises:
            InvalidArgumentError: :code:`graph` is not a property graph or unloaded.

        Returns:
            :class:`InteractiveQuery`
        """
        if (graph.vineyard_id in self._interactive_instance_dict
                and self._interactive_instance_dict[graph.vineyard_id]
                is not None):
            return self._interactive_instance_dict[graph.vineyard_id]

        if not graph.loaded():
            raise InvalidArgumentError("The graph has already been unloaded")
        if not graph.graph_type == types_pb2.ARROW_PROPERTY:
            raise InvalidArgumentError("The graph should be a property graph.")

        if engine_params is not None:
            engine_params = {
                str(key): str(value)
                for key, value in engine_params.items()
            }
        else:
            engine_params = {}
        from graphscope.interactive.query import InteractiveQuery

        response = self._grpc_client.create_interactive_engine(
            object_id=graph.vineyard_id,
            schema_path=graph.schema_path,
            gremlin_server_cpu=gs_config.k8s_gie_gremlin_server_cpu,
            gremlin_server_mem=gs_config.k8s_gie_gremlin_server_mem,
            engine_params=engine_params,
        )
        interactive_query = InteractiveQuery(
            graphscope_session=self,
            object_id=graph.vineyard_id,
            front_ip=response.frontend_host,
            front_port=response.frontend_port,
        )
        self._interactive_instance_dict[graph.vineyard_id] = interactive_query
        graph.attach_interactive_instance(interactive_query)
        return interactive_query
예제 #3
0
    def gremlin(self, graph, engine_params=None):
        """Get a interactive engine handler to execute gremlin queries.

        Note that this method will be executed implicitly when a property graph created
        and cache a instance of InteractiveQuery in session if `initializing_interactive_engine`
        is True. If you want to create a new instance under the same graph by different params,
        you should close the instance first.

        .. code:: python

            >>> # close and recreate InteractiveQuery.
            >>> interactive_query = sess.gremlin(g)
            >>> interactive_query.close()
            >>> interactive_query = sess.gremlin(g, engine_params={"xxx":"xxx"})


        Args:
            graph (:class:`Graph`): Use the graph to create interactive instance.
            engine_params (dict, optional): Configure startup parameters of interactive engine.
                You can also configure this param by `graphscope.set_option(engine_params={})`.
                See a list of configurable keys in
                `interactive_engine/deploy/docker/dockerfile/executor.vineyard.properties`

        Raises:
            InvalidArgumentError: :code:`graph` is not a property graph or unloaded.

        Returns:
            :class:`InteractiveQuery`
        """

        # self._interactive_instance_dict[graph.vineyard_id] will be None if
        # InteractiveQuery closed
        if (graph.vineyard_id in self._interactive_instance_dict
                and self._interactive_instance_dict[graph.vineyard_id]
                is not None):
            interactive_query = self._interactive_instance_dict[
                graph.vineyard_id]
            if interactive_query.status == InteractiveQueryStatus.Running:
                return interactive_query
            elif interactive_query.status == InteractiveQueryStatus.Failed:
                raise InteractiveEngineInternalError(
                    interactive_query.error_msg)
            else:
                # Initializing.
                # while True is ok, as the status is either running or failed eventually after timeout.
                while True:
                    time.sleep(1)
                    if interactive_query.status == InteractiveQueryStatus.Running:
                        return interactive_query
                    elif interactive_query.status == InteractiveQueryStatus.Failed:
                        raise InteractiveEngineInternalError(
                            interactive_query.error_msg)

        if not graph.loaded():
            raise InvalidArgumentError("The graph has already been unloaded")
        if not graph.graph_type == types_pb2.ARROW_PROPERTY:
            raise InvalidArgumentError("The graph should be a property graph.")

        interactive_query = InteractiveQuery(session=self,
                                             object_id=graph.vineyard_id)
        self._interactive_instance_dict[graph.vineyard_id] = interactive_query

        if engine_params is not None:
            engine_params = {
                str(key): str(value)
                for key, value in engine_params.items()
            }
        else:
            engine_params = {}

        try:
            response = self._grpc_client.create_interactive_engine(
                object_id=graph.vineyard_id,
                schema_path=graph.schema_path,
                gremlin_server_cpu=gs_config.k8s_gie_gremlin_server_cpu,
                gremlin_server_mem=gs_config.k8s_gie_gremlin_server_mem,
                engine_params=engine_params,
            )
        except Exception as e:
            interactive_query.status = InteractiveQueryStatus.Failed
            interactive_query.error_msg = str(e)
            raise InteractiveEngineInternalError(str(e)) from e
        else:
            interactive_query.set_frontend(front_ip=response.frontend_host,
                                           front_port=response.frontend_port)
            interactive_query.status = InteractiveQueryStatus.Running
            graph.attach_interactive_instance(interactive_query)

        return interactive_query