What is the difference between fully homomorphic and semi-homomorphic encryption?
If you're happy with a more mathematical definition:
A Fully-Homomorphic Encryption preserves a ring-structure.
This means we have a Ring (R,+,*), where R are our bits on which we operate, (R,+) is an abelian group, while (R,*) is an monoid. With addition and mupltiplication over bits it's possible to create NAND gates. If you have NAND gates, you can derive every other boolean gate and therefore are able to do every computation on the encrypted data.
Semi-Homomorphic Encryption on the other hand only supports one operation and because of that you are not able to create NAND gates, which means you can't do every computation on the encrypted data.
Shortly, an 'homorphic encryption scheme' means that you are able to apply operations on the ciphered message and see the result of the these operations once the message is deciphered.
Usually, these operations are related to arithmetics (which is known to be Turing-complete meaning that you can encode any program in it).
As arithmetics operators are 'addition' and 'multiplication' (subtraction and division are the dual of these operators). A fully homomorphic encryption scheme is able to perform addition and multiplication on the ciphered message.
A 'semi-homomorphic encryption scheme' supports only one of the two operators. For example, the RSA encryption scheme is homomorphic for the multiplication (but clearly not for the addition).
Usually when you talk about "semi-homomorphic encryption", it can mean two things :
You don't support all the operations of fully homomorphic encryption (for instance addition but not multiplication) because your use-case only require a subset of them and that will lower the (tremendous) overhead of homomorphic encryption.
Your system has an homomorphic behavior, but because of the taint/noise added to the data, the more you manipulate some data, the less they are secure (i.e. either you have to increase cipher size to compensate, or you will just have to discard data after a given number of operations because they are not deemed 'secure' enough anymore)
Without more context, it's hard to tell which one you are asking about.