For drawing the line at y=0, I would use
\draw ({rel axis cs:0,0}|-{axis cs:0,0}) -- ({rel axis cs:1,0}|-{axis cs:0,0});
It looks a bit intimidating at first, but it's not actually that bad. rel axis cs=0,0 is the lower left corner of the plot area, rel axis cs:1,0 is the lower right. axis cs:0,0 is the origin of the coordinate system. The syntax (A|-B) specifies the point that lies on the intersection of a vertical line through A and a horizontal line through B, so ({rel axis cs:0,0}|-{axis cs:0,0}) is the point above the lower left corner of the plot area at the height of the coordinate system origin. The braces are necessary to mask the comma, which usually separates different options from each other.
The advantage of this approach compared to saying \draw (axis cs:0,0) -- (axis cs:10,0) is that the line will always span the entire width of the plot, no matter what the x range is.
For getting the labels, I would suggest using nodes near coords. These place a node at each plot coordinate, by default printing the meta value, or if that is not available, the y value. For working with reasonably complex datasets like yours (coordinates, error and meta data), I would recommend using \addplot table instead of \addplot coordinates, which is much less flexible.
You could just say nodes near coords, point meta=explicit in the addplot options, and specify the meta source by saying meta=<column name> in the table options, which would add nodes with the label values at each coordinate. However, for negative y values, this would cause the nodes to end up inside the bar, instead of underneath them, because the vertical placement depends on the sign of the meta data. To work around this, you can use a slightly more advanced feature, visualization depends on = \thisrow{<column name>} \as <macro>, which makes an additional table column available inside the nodes near coords. If you then say nodes near coords=\pgfmathprintnumber{<macro>}, the vertical placement will be determined by the y value, but the node text will depend on a different column in your table.

\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
title = {Optimization based upon co-occurences},
xbar,
width=10cm,
xtick={1,...,8},
xticklabels={%
atpB,
atpE,
atpF,
atpH,
atpA,
atpG,
atpD,
atpC},
grid=major,
]
\addplot[
fill=blue!25,
draw=black,
ybar,
point meta=y,
visualization depends on=\thisrow{label} \as \barlabel,
nodes near coords=\pgfmathprintnumber{\barlabel},
every node near coord/.style={inner ysep=5pt},
error bars/.cd,
y dir=both,
y explicit
]
table [y error=error] {
x y error label
1 -0.279535 0.015982 2
2 0.739360 0.031211 4
3 -0.279302 0.017384 1
4 -0.602794 0.022327 1
5 0.487714 0.015970 8
6 -0.294501 0.014923 4
7 0.526527 0.016725 5
8 -0.297469 0.021122 1
};
\draw ({rel axis cs:0,0}|-{axis cs:0,0}) -- ({rel axis cs:1,0}|-{axis cs:0,0});
\end{axis}
\end{tikzpicture}
\end{document}
\draw [red, ultra thick] (axis cs:0,0) -- (axis cs:10,0);to thicken the x-axis. – Peter Grill Nov 22 '11 at 10:31