code: def _AddArtifactNodesAndEdges(self, artifact_names):
      
      for artifact_name in artifact_names:
        self.graph[artifact_name] = self.Node(is_artifact=True)
        rdf_artifact = artifact_registry.REGISTRY.GetArtifact(artifact_name)
        self._AddDependencyEdges(rdf_artifact)
        self._AddProvidesEdges(rdf_artifact)
docs: Add the artifact nodes to the graph.
  
      For every artifact that has to be collected, add a node to the dependency
      graph.
  
      The edges represent the dependencies. An artifact has outgoing edges to the
      attributes it provides and incoming edges from attributes it depends on.
      Initially, only artifacts without incoming edges are reachable. An artifact
      becomes reachable if all of its dependencies are reachable.
  
      Args:
        artifact_names: List of names of the artifacts to collect.