Most service composition approaches rely on top-down decomposition of a problem and AI-style planning to assemble service components into a meaningful whole, impeding reuse and flexibility. In this article, we propose an approach that starts from declarative knowledge about the semantics of individual service components and algorithmically constructs a full-blown service orchestration process that supports sequence, choice, and parallelism. The output of our algorithm can be mapped directly into a number of service orchestration languages such as OWL-S and BPEL. The approach consists of two steps. First, semantic links specifying data dependencies among the services are derived and organized in a flexible network. Second, based on a user request indicating the desired outcomes from the composition, an executable composition is constructed from the network that satisfies the dependencies. The approach is unique in producing complex compositions out of semantic links between services in a flexible way. It also allows reusing knowledge about semantic dependencies in the network to generate new compositions through new requests and modification of services at runtime. The approach has been implemented in a prototype that outperforms related composition prototypes in experiments.