Conditional random fields have had wide empirical success, and there has been increasing interest in toolkits that ease their application to complex relational data. The power in relational models is in their repeated structure and tied parameters ; at issue is how to define these structures in a powerful and flexible way. Rather than using a declarative language, such as SQL or first-order logic, we advocate using an imperative language to express various aspects of model structure, inference, and learning. By combining the traditional, declarative, statistical semantics of factor graphs with imperative definitions of their construction and operation, we allow the user to mix declarative and procedural domain knowledge, and also gain significant efficiencies. We have implemented such imperatively defined factor graphs in a system we call FACTORIE, a software library for an object-oriented, strongly-typed, functional language called Scala. I will introduce this probabilistic programming language and give several examples of its use, includings its application to probabilistic databases. In experimental comparisons to Markov Logic Networks on joint segmentation and coreference, we find our approach to be 3-20 times faster while reducing error by 20-25%---achieving a new state of the art.