static public double resultSize(Edge edge) {
		double size = 0;
		int t = edge.getTripleCount();
		if(t == 0) {
			t = TotalTriples/TotalProperties;
		}
		Vertex v1 = edge.getV1();
		Vertex v2 = edge.getV2();
		if(!v1.isBound() && !v2.isBound()) {
			return t;
		}
		//if both vertices are bound, we use the minimum number of input bindings
		//to calculate the expected result size
		int o;
		int in;
		if(v1.getNumber()<v2.getNumber()) {
			in = v1.getNumber();
			o = edge.getDistinctSubject();
			//in case the statistics provides no property partitions
			//assume entities are uniformly distributed for properties
			if(o == 0)
				o = TotalSubjects/TotalProperties;
		} else {
			in = v2.getNumber();
			o = edge.getDistinctObject();
			if(o == 0)
				o = TotalObjects/TotalProperties;
		}
		int to = TotalEntities;
		size = calculateResultSize(in,t,o,to);
		//the expected number of results won't exceed the total number of triples
		//with the predicate of this edge
		size = Math.min(size, t);
		return size;
	}